From 3c93a594ccbbe0a07823c2728f35041536736377 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Fri, 14 Jul 2023 16:50:40 -0400 Subject: [PATCH 01/28] Updated .gitignore --- .gitignore | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 8d39bb4..917ee82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# # Binaries for programs and plugins *.exe *.exe~ @@ -5,14 +8,23 @@ *.so *.dylib -# Test binary, build with `go test -c` +# Test binary, built with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + # custom -build +.vscode .env -*.key -log \ No newline at end of file +build +log +*.pem +*.key \ No newline at end of file From 9192524d52c946e9af695ec7a3e640dc4012b8e8 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Fri, 14 Jul 2023 17:00:48 -0400 Subject: [PATCH 02/28] Update to new library standards --- go.mod | 57 ++++--- go.sum | 140 ++++++++++-------- nex/datastore/change_meta.go | 3 +- nex/datastore/complete_post_object.go | 3 +- nex/datastore/get_meta.go | 19 +-- nex/datastore/get_metas_multiple_param.go | 7 +- nex/datastore/prepare_get_object.go | 13 +- nex/datastore/prepare_post_object.go | 21 +-- nex/datastore/rate_objects.go | 3 +- .../super-mario-maker/add_to_buffer_queues.go | 3 +- .../super-mario-maker/complete_attach_file.go | 4 +- .../ctr_pick_up_course_search_object.go | 7 +- .../followings_latest_course_search_object.go | 9 +- .../super-mario-maker/get_buffer_queue.go | 3 +- .../super-mario-maker/get_course_record.go | 5 +- .../get_custom_ranking_by_data_id.go | 27 ++-- .../get_metas_with_course_record.go | 5 +- .../super-mario-maker/get_object_infos.go | 13 +- .../super-mario-maker/prepare_attach_file.go | 25 ++-- .../super-mario-maker/rate_custom_ranking.go | 3 +- .../recommended_course_search_object.go | 7 +- .../suggested_course_search_object.go | 7 +- .../super-mario-maker/upload_course_record.go | 3 +- nex/register_common_protocols.go | 7 +- nex/register_nex_protocols.go | 2 +- .../common/add_connection.go | 5 - .../common/does_connection_exist.go | 7 - .../common/update_connection.go | 5 - nex/server.go | 2 +- utility/utility.go | 70 ++++----- 30 files changed, 249 insertions(+), 236 deletions(-) delete mode 100644 nex/secure-connection/common/add_connection.go delete mode 100644 nex/secure-connection/common/does_connection_exist.go delete mode 100644 nex/secure-connection/common/update_connection.go diff --git a/go.mod b/go.mod index f9b2f68..7fe0cb0 100644 --- a/go.mod +++ b/go.mod @@ -3,46 +3,45 @@ module github.com/PretendoNetwork/super-mario-maker-secure go 1.19 require ( - github.com/PretendoNetwork/nex-go v1.0.16 - github.com/PretendoNetwork/nex-protocols-common-go v1.0.17 - github.com/PretendoNetwork/nex-protocols-go v1.0.20 - github.com/PretendoNetwork/plogger-go v1.0.2 - github.com/aws/aws-sdk-go-v2/service/s3 v1.31.2 - github.com/gocql/gocql v1.3.2 + github.com/PretendoNetwork/nex-go v1.0.29 + github.com/PretendoNetwork/nex-protocols-common-go v1.0.23 + github.com/PretendoNetwork/nex-protocols-go v1.0.41 + github.com/PretendoNetwork/plogger-go v1.0.3 + github.com/aws/aws-sdk-go-v2/service/s3 v1.37.0 + github.com/gocql/gocql v1.5.2 github.com/joho/godotenv v1.5.1 - go.mongodb.org/mongo-driver v1.11.4 + go.mongodb.org/mongo-driver v1.12.0 ) require ( - github.com/aws/aws-sdk-go-v2 v1.17.8 // indirect + github.com/aws/aws-sdk-go-v2 v1.19.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.27 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.27 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.30 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.4 // indirect github.com/aws/smithy-go v1.13.5 // indirect github.com/fatih/color v1.15.0 // indirect - github.com/golang/snappy v0.0.3 // indirect + github.com/golang/snappy v0.0.4 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/jwalton/go-supportscolor v1.1.0 // indirect - github.com/klauspost/compress v1.13.6 // indirect + github.com/jwalton/go-supportscolor v1.2.0 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect github.com/superwhiskers/crunch/v3 v3.5.7 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect - golang.org/x/text v0.4.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect + golang.org/x/crypto v0.11.0 // indirect + golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index 1a1a9fc..8397011 100644 --- a/go.sum +++ b/go.sum @@ -1,31 +1,31 @@ -github.com/PretendoNetwork/nex-go v1.0.16 h1:g2lJW8G+WOS6/8qsgQ0+jLlzemjJ60tQtLqloLTjElo= -github.com/PretendoNetwork/nex-go v1.0.16/go.mod h1:Bx2ONeSefnbJyE0IDIwGopxrjRrnszOV/uQv74Cx+m0= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.17 h1:w0n+RJAHANgX/iVnL5qRiyPJeDHcwr8w6DzDeFqxkqk= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.17/go.mod h1:5Y3jRIbvDxasj0CIvd024za+t9LMbD0OZkBwyKICijg= -github.com/PretendoNetwork/nex-protocols-go v1.0.20 h1:vUoYHFvVWWx9Bm9/2JiN1siW03tFxtD4NY9w/WfC878= -github.com/PretendoNetwork/nex-protocols-go v1.0.20/go.mod h1:Bt7hI7hJ+8r6UU5LSs+3xx4xzsvMVeEUkAW8Cg3lGjQ= -github.com/PretendoNetwork/plogger-go v1.0.2 h1:vWKEnEmJJzYwqLxLyiSsAvCrZV6qnnu/a0GQOjIfzY0= -github.com/PretendoNetwork/plogger-go v1.0.2/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= -github.com/aws/aws-sdk-go-v2 v1.17.8 h1:GMupCNNI7FARX27L7GjCJM8NgivWbRgpjNI/hOQjFS8= -github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/PretendoNetwork/nex-go v1.0.29 h1:Mu/UGpYEt0YHgJR/l+8Ysc5rlX91NE86ab3sMSKpPWo= +github.com/PretendoNetwork/nex-go v1.0.29/go.mod h1:tWfWhrC/DCJuS08jTk0ceOv2R1VtElvKSVv13To6miE= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.23 h1:5nhsCg0NtJ+Wlq4eAxLkpazsBDWOnSHLgpllW3XUeE0= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.23/go.mod h1:WqdDoCdjAHg4cdnIGJCrBQUX/JQIJHbw0D5oQWZ8mfk= +github.com/PretendoNetwork/nex-protocols-go v1.0.41 h1:f4AJxoIgKt5k22IcYF/SM5MazR0/34hmyflZkFt/Hug= +github.com/PretendoNetwork/nex-protocols-go v1.0.41/go.mod h1:DPRCNkz45onV4ySCRJNp2+69NQnRa+SRqeErsnjW6P4= +github.com/PretendoNetwork/plogger-go v1.0.3 h1:KEnrUfPaCn0LFweg8OrhtiDhlN3pclWpNhlmAtmgfB0= +github.com/PretendoNetwork/plogger-go v1.0.3/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= +github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= +github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32 h1:dpbVNUjczQ8Ae3QKHbpHBpfvaVkRdesxpTOe9pTouhU= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26 h1:QH2kOS3Ht7x+u0gHCh06CXL/h6G8LQJFpZfFBYBNboo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.24 h1:zsg+5ouVLLbePknVZlUMm1ptwyQLkjjLMWnN+kVs5dA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.24/go.mod h1:+fFaIjycTmpV6hjmPTbyU9Kp5MI/lA+bbibcAtmlhYA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.27 h1:cZG7psLfqpkB6H+fIrgUDWmlzM474St1LP0jcz272yI= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.27/go.mod h1:ZdjYvJpDlefgh8/hWelJhqgqJeodxu4SmbVsSdBlL7E= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.27 h1:qIw7Hg5eJEc1uSxg3hRwAthPAO7NeOd4dPxhaTi0yB0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.27/go.mod h1:Zz0kvhcSlu3NX4XJkaGgdjaa+u7a9LYuy8JKxA5v3RM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26 h1:uUt4XctZLhl9wBE1L8lobU3bVN8SNUP7T+olb0bWBO4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.1 h1:lRWp3bNu5wy0X3a8GS42JvZFlv++AKsMdzEnoiVJrkg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.1/go.mod h1:VXBHSxdN46bsJrkniN68psSwbyBKsazQfU2yX/iSDso= -github.com/aws/aws-sdk-go-v2/service/s3 v1.31.2 h1:iOZoYePk+EuBI1tC7bxeRjO+JvClcYm2fZYW5WPIOMQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.31.2/go.mod h1:aSl9/LJltSz1cVusiR/Mu8tvI4Sv/5w/WWrJmmkNii0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.30 h1:Bje8Xkh2OWpjBdNfXLrnn8eZg569dUQmhgtydxAYyP0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.30/go.mod h1:qQtIBl5OVMfmeQkz8HaVyh5DzFmmFXyvK27UgIgOr4c= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.4 h1:hx4WksB0NRQ9utR+2c3gEGzl6uKj3eM6PMQ6tN3lgXs= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.4/go.mod h1:JniVpqvw90sVjNqanGLufrVapWySL28fhBlYgl96Q/w= +github.com/aws/aws-sdk-go-v2/service/s3 v1.37.0 h1:PalLOEGZ/4XfQxpGZFTLaoJSmPoybnqJYotaIZEf/Rg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.37.0/go.mod h1:PwyKKVL0cNkC37QwLcrhyeCrAk+5bY8O2ou7USyAS2A= github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= @@ -37,11 +37,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/gocql/gocql v1.3.2 h1:ox3T+R7VFibHSIGxRkuUi1uIvAv8jBHCWxc+9aFQ/LA= -github.com/gocql/gocql v1.3.2/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/gocql/gocql v1.5.2 h1:WnKf8xRQImcT/KLaEWG2pjEeryDB7K0qQN9mPs1C58Q= +github.com/gocql/gocql v1.5.2/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -51,10 +52,11 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/jwalton/go-supportscolor v1.1.0 h1:HsXFJdMPjRUAx8cIW6g30hVSFYaxh9yRQwEWgkAR7lQ= -github.com/jwalton/go-supportscolor v1.1.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= +github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -63,63 +65,77 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg= github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= +github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= +go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/nex/datastore/change_meta.go b/nex/datastore/change_meta.go index 6439bef..800d0de 100644 --- a/nex/datastore/change_meta.go +++ b/nex/datastore/change_meta.go @@ -3,10 +3,11 @@ package nex_datastore import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMetaParam *datastore.DataStoreChangeMetaParam) { +func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMetaParam *datastore_types.DataStoreChangeMetaParam) { // STUBBED // TODO: DO SOMETHING WITH THE DATA rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) diff --git a/nex/datastore/complete_post_object.go b/nex/datastore/complete_post_object.go index 04f2ca4..f9fd6cb 100644 --- a/nex/datastore/complete_post_object.go +++ b/nex/datastore/complete_post_object.go @@ -3,10 +3,11 @@ package nex_datastore import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore.DataStoreCompletePostParam) { +func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) { // TODO: DO SOMETHING WITH THE DATA rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) diff --git a/nex/datastore/get_meta.go b/nex/datastore/get_meta.go index 21ddf59..ae889fe 100644 --- a/nex/datastore/get_meta.go +++ b/nex/datastore/get_meta.go @@ -6,12 +6,13 @@ import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func GetMeta(err error, client *nex.Client, callID uint32, param *datastore.DataStoreGetMetaParam) { +func GetMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { switch param.DataID { case 0: // Mii Data getMetaMiiData(client, callID, param) @@ -22,7 +23,7 @@ func GetMeta(err error, client *nex.Client, callID uint32, param *datastore.Data } } -func getMetaMiiData(client *nex.Client, callID uint32, param *datastore.DataStoreGetMetaParam) { +func getMetaMiiData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { miiInfo := database.GetUserMiiInfoByPID(param.PersistenceTarget.OwnerID) pMetaInfo := utility.UserMiiDataToDataStoreMetaInfo(param.PersistenceTarget.OwnerID, miiInfo) @@ -51,22 +52,22 @@ func getMetaMiiData(client *nex.Client, callID uint32, param *datastore.DataStor globals.NEXServer.Send(responsePacket) } -func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datastore.DataStoreGetMetaParam) { +func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { objectSize, _ := utility.S3ObjectSize(os.Getenv("S3_BUCKET_NAME"), "special/900000.bin") - pMetaInfo := datastore.NewDataStoreMetaInfo() + pMetaInfo := datastore_types.NewDataStoreMetaInfo() pMetaInfo.DataID = 900000 pMetaInfo.OwnerID = 2 pMetaInfo.Size = uint32(objectSize) pMetaInfo.Name = "" pMetaInfo.DataType = 50 // Metdata? pMetaInfo.MetaBinary = []byte{} - pMetaInfo.Permission = datastore.NewDataStorePermission() + pMetaInfo.Permission = datastore_types.NewDataStorePermission() pMetaInfo.Permission.Permission = 0 // idk? - pMetaInfo.Permission.RecipientIds = []uint32{} - pMetaInfo.DelPermission = datastore.NewDataStorePermission() + pMetaInfo.Permission.RecipientIDs = []uint32{} + pMetaInfo.DelPermission = datastore_types.NewDataStorePermission() pMetaInfo.DelPermission.Permission = 0 // idk? - pMetaInfo.DelPermission.RecipientIds = []uint32{} + pMetaInfo.DelPermission.RecipientIDs = []uint32{} pMetaInfo.CreatedTime = nex.NewDateTime(135271087238) // Reused from Nintendo pMetaInfo.UpdatedTime = nex.NewDateTime(135402751254) // Reused from Nintendo pMetaInfo.Period = 64306 // idk? @@ -77,7 +78,7 @@ func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datast pMetaInfo.ReferredTime = nex.NewDateTime(135271087238) // Reused from Nintendo pMetaInfo.ExpireTime = nex.NewDateTime(671075926016) // Reused from Nintendo pMetaInfo.Tags = []string{} // idk? - pMetaInfo.Ratings = []*datastore.DataStoreRatingInfoWithSlot{} + pMetaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} rmcResponseStream := nex.NewStreamOut(globals.NEXServer) rmcResponseStream.WriteStructure(pMetaInfo) diff --git a/nex/datastore/get_metas_multiple_param.go b/nex/datastore/get_metas_multiple_param.go index 257a32a..d6a4330 100644 --- a/nex/datastore/get_metas_multiple_param.go +++ b/nex/datastore/get_metas_multiple_param.go @@ -5,13 +5,14 @@ import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params []*datastore.DataStoreGetMetaParam) { - pMetaInfo := make([]*datastore.DataStoreMetaInfo, 0) +func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params []*datastore_types.DataStoreGetMetaParam) { + pMetaInfo := make([]*datastore_types.DataStoreMetaInfo, 0) pResults := make([]uint32, 0) for _, param := range params { @@ -50,7 +51,7 @@ func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params globals.NEXServer.Send(responsePacket) } -func getMetasMultipleParamMiiData(param *datastore.DataStoreGetMetaParam) *datastore.DataStoreMetaInfo { +func getMetasMultipleParamMiiData(param *datastore_types.DataStoreGetMetaParam) *datastore_types.DataStoreMetaInfo { miiInfo := database.GetUserMiiInfoByPID(param.PersistenceTarget.OwnerID) return utility.UserMiiDataToDataStoreMetaInfo(param.PersistenceTarget.OwnerID, miiInfo) diff --git a/nex/datastore/prepare_get_object.go b/nex/datastore/prepare_get_object.go index 6f114d0..f3a46a1 100644 --- a/nex/datastore/prepare_get_object.go +++ b/nex/datastore/prepare_get_object.go @@ -6,29 +6,30 @@ import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePrepareGetParam *datastore.DataStorePrepareGetParam) { - pReqGetInfo := datastore.NewDataStoreReqGetInfo() +func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePrepareGetParam *datastore_types.DataStorePrepareGetParam) { + pReqGetInfo := datastore_types.NewDataStoreReqGetInfo() if dataStorePrepareGetParam.DataID == 900000 { objectSize, _ := utility.S3ObjectSize(os.Getenv("S3_BUCKET_NAME"), "special/900000.bin") pReqGetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/special/900000.bin", "pds-AMAJ-d1") - pReqGetInfo.RequestHeaders = []*datastore.DataStoreKeyValue{} + pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} pReqGetInfo.Size = uint32(objectSize) - pReqGetInfo.RootCA = []byte{} + pReqGetInfo.RootCACert = []byte{} pReqGetInfo.DataID = 900000 } else { courseMetadata := database.GetCourseMetadataByDataID(dataStorePrepareGetParam.DataID) pReqGetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/course/%d.bin", os.Getenv("S3_BUCKET_NAME"), dataStorePrepareGetParam.DataID) - pReqGetInfo.RequestHeaders = []*datastore.DataStoreKeyValue{} + pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} pReqGetInfo.Size = courseMetadata.Size - pReqGetInfo.RootCA = []byte{} + pReqGetInfo.RootCACert = []byte{} pReqGetInfo.DataID = dataStorePrepareGetParam.DataID } diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go index 5e8d146..27cb53c 100644 --- a/nex/datastore/prepare_post_object.go +++ b/nex/datastore/prepare_post_object.go @@ -12,11 +12,12 @@ import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore.DataStorePreparePostParam) { +func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePreparePostParam) { rand.Seed(time.Now().UnixNano()) nodeID := rand.Intn(len(globals.DataStoreIDGenerators)) @@ -42,38 +43,38 @@ func PreparePostObject(err error, client *nex.Client, callID uint32, param *data signature := hex.EncodeToString(hmac.Sum(nil)) - fieldBucket := datastore.NewDataStoreKeyValue() + fieldBucket := datastore_types.NewDataStoreKeyValue() fieldBucket.Key = "bucket" fieldBucket.Value = bucket - fieldKey := datastore.NewDataStoreKeyValue() + fieldKey := datastore_types.NewDataStoreKeyValue() fieldKey.Key = "key" fieldKey.Value = key - fieldACL := datastore.NewDataStoreKeyValue() + fieldACL := datastore_types.NewDataStoreKeyValue() fieldACL.Key = "acl" fieldACL.Value = "private" - fieldPID := datastore.NewDataStoreKeyValue() + fieldPID := datastore_types.NewDataStoreKeyValue() fieldPID.Key = "pid" fieldPID.Value = pid - fieldDate := datastore.NewDataStoreKeyValue() + fieldDate := datastore_types.NewDataStoreKeyValue() fieldDate.Key = "date" fieldDate.Value = date - fieldSignature := datastore.NewDataStoreKeyValue() + fieldSignature := datastore_types.NewDataStoreKeyValue() fieldSignature.Key = "signature" fieldSignature.Value = signature rmcResponseStream := nex.NewStreamOut(globals.NEXServer) - pReqPostInfo := datastore.NewDataStoreReqPostInfo() + pReqPostInfo := datastore_types.NewDataStoreReqPostInfo() pReqPostInfo.DataID = dataID pReqPostInfo.URL = os.Getenv("DATASTORE_UPLOAD_URL") - pReqPostInfo.RequestHeaders = []*datastore.DataStoreKeyValue{} - pReqPostInfo.FormFields = []*datastore.DataStoreKeyValue{fieldBucket, fieldKey, fieldACL, fieldPID, fieldDate, fieldSignature} + pReqPostInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} + pReqPostInfo.FormFields = []*datastore_types.DataStoreKeyValue{fieldBucket, fieldKey, fieldACL, fieldPID, fieldDate, fieldSignature} pReqPostInfo.RootCACert = []byte{} rmcResponseStream.WriteStructure(pReqPostInfo) diff --git a/nex/datastore/rate_objects.go b/nex/datastore/rate_objects.go index fa29fa7..0330656 100644 --- a/nex/datastore/rate_objects.go +++ b/nex/datastore/rate_objects.go @@ -3,10 +3,11 @@ package nex_datastore import ( nex "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore.DataStoreRatingTarget, params []*datastore.DataStoreRateObjectParam, transactional bool, fetchRatings bool) { +func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore_types.DataStoreRatingTarget, params []*datastore_types.DataStoreRateObjectParam, transactional bool, fetchRatings bool) { // TODO: complete this rmcResponseStream := nex.NewStreamOut(globals.NEXServer) diff --git a/nex/datastore/super-mario-maker/add_to_buffer_queues.go b/nex/datastore/super-mario-maker/add_to_buffer_queues.go index f9e6e4f..3f3f9a9 100644 --- a/nex/datastore/super-mario-maker/add_to_buffer_queues.go +++ b/nex/datastore/super-mario-maker/add_to_buffer_queues.go @@ -3,11 +3,12 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker.BufferQueueParam, buffers [][]byte) { +func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) { pResults := make([]uint32, 0) for i := 0; i < len(params); i++ { diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 42c7fcc..3c6221e 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -5,12 +5,12 @@ import ( "os" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore.DataStoreCompletePostParam) { +func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) { rmcResponseStream := nex.NewStreamOut(globals.NEXServer) // TODO: complete this diff --git a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go index 96a60f9..17d58fc 100644 --- a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go +++ b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go @@ -2,8 +2,9 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" @@ -11,8 +12,8 @@ import ( // This is the same as DataStoreSMM::RecommendedCourseSearchObject // Not sure why they used a different method here? -func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore.DataStoreSearchParam, extraData []string) { - pRankingResults := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) +func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) { + pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) courseMetadatas := database.GetCourseMetadatasByLimit(100) // In PCAPs param.minimalRatingFrequency is 100 but is 0 here? diff --git a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go index 59b1d34..268bdb8 100644 --- a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go +++ b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go @@ -2,17 +2,18 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore.DataStoreSearchParam, extraData []string) { - pRankingResults := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) +func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) { + pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) - for _, pid := range dataStoreSearchParam.OwnerIds { + for _, pid := range dataStoreSearchParam.OwnerIDs { courseMetadatas := database.GetCourseMetadatasByPID(pid) for _, courseMetadata := range courseMetadatas { diff --git a/nex/datastore/super-mario-maker/get_buffer_queue.go b/nex/datastore/super-mario-maker/get_buffer_queue.go index 7f0eef3..bebc2da 100644 --- a/nex/datastore/super-mario-maker/get_buffer_queue.go +++ b/nex/datastore/super-mario-maker/get_buffer_queue.go @@ -5,11 +5,12 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker.BufferQueueParam) { +func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) { // TODO: complete this rmcResponseStream := nex.NewStreamOut(globals.NEXServer) diff --git a/nex/datastore/super-mario-maker/get_course_record.go b/nex/datastore/super-mario-maker/get_course_record.go index f03b436..6291cf5 100644 --- a/nex/datastore/super-mario-maker/get_course_record.go +++ b/nex/datastore/super-mario-maker/get_course_record.go @@ -3,11 +3,12 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker.DataStoreGetCourseRecordParam) { +func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCourseRecordParam) { worldRecord := database.GetCourseWorldRecord(param.DataID) rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) @@ -15,7 +16,7 @@ func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datast if worldRecord == nil { rmcResponse.SetError(0x690004) } else { - result := datastore_super_mario_maker.NewDataStoreGetCourseRecordResult() + result := datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult() result.DataID = param.DataID result.Slot = param.Slot result.FirstPID = worldRecord.FirstPID diff --git a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go index 8bffa56..e0206cb 100644 --- a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go +++ b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go @@ -3,18 +3,19 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func GetCustomRankingByDataId(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker.DataStoreGetCustomRankingByDataIdParam) { - var pRankingResult []*datastore_super_mario_maker.DataStoreCustomRankingResult +func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) { + var pRankingResult []*datastore_super_mario_maker_types.DataStoreCustomRankingResult var pResults []uint32 - switch param.ApplicationId { + switch param.ApplicationID { case 0: - if len(param.DataIdList) == 0 { // Starred courses + if len(param.DataIDList) == 0 { // Starred courses pRankingResult, pResults = getCustomRankingByDataIdStarredCourses(client.PID()) } else { // Played courses pRankingResult, pResults = getCustomRankingByDataIdCourseMetadata(param) @@ -33,7 +34,7 @@ func GetCustomRankingByDataId(err error, client *nex.Client, callID uint32, para rmcResponseBody := rmcResponseStream.Bytes() rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) - rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetCustomRankingByDataId, rmcResponseBody) + rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetCustomRankingByDataID, rmcResponseBody) rmcResponseBytes := rmcResponse.Bytes() @@ -51,10 +52,10 @@ func GetCustomRankingByDataId(err error, client *nex.Client, callID uint32, para globals.NEXServer.Send(responsePacket) } -func getCustomRankingByDataIdStarredCourses(pid uint32) ([]*datastore_super_mario_maker.DataStoreCustomRankingResult, []uint32) { +func getCustomRankingByDataIdStarredCourses(pid uint32) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { courseMetadatas := database.GetUserStarredCourses(pid) - pRankingResult := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) + pRankingResult := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) pResults := make([]uint32, 0) for _, courseMetadata := range courseMetadatas { @@ -65,11 +66,11 @@ func getCustomRankingByDataIdStarredCourses(pid uint32) ([]*datastore_super_mari return pRankingResult, pResults } -func getCustomRankingByDataIdMiiData(param *datastore_super_mario_maker.DataStoreGetCustomRankingByDataIdParam) ([]*datastore_super_mario_maker.DataStoreCustomRankingResult, []uint32) { - pRankingResult := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) +func getCustomRankingByDataIdMiiData(param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { + pRankingResult := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) pResults := make([]uint32, 0) - for _, pid := range param.DataIdList { + for _, pid := range param.DataIDList { pid := uint32(pid) miiInfo := database.GetUserMiiInfoByPID(pid) // This isn't actually a PID when using the official servers! I set it as one to make this easier for me @@ -82,10 +83,10 @@ func getCustomRankingByDataIdMiiData(param *datastore_super_mario_maker.DataStor return pRankingResult, pResults } -func getCustomRankingByDataIdCourseMetadata(param *datastore_super_mario_maker.DataStoreGetCustomRankingByDataIdParam) ([]*datastore_super_mario_maker.DataStoreCustomRankingResult, []uint32) { - courseMetadatas := database.GetCourseMetadataByDataIDs(param.DataIdList) +func getCustomRankingByDataIdCourseMetadata(param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { + courseMetadatas := database.GetCourseMetadataByDataIDs(param.DataIDList) - pRankingResult := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) + pRankingResult := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) pResults := make([]uint32, 0) for _, courseMetadata := range courseMetadatas { diff --git a/nex/datastore/super-mario-maker/get_metas_with_course_record.go b/nex/datastore/super-mario-maker/get_metas_with_course_record.go index a81e948..acf3da1 100644 --- a/nex/datastore/super-mario-maker/get_metas_with_course_record.go +++ b/nex/datastore/super-mario-maker/get_metas_with_course_record.go @@ -2,12 +2,13 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, dataStoreGetCourseRecordParams []*datastore_super_mario_maker.DataStoreGetCourseRecordParam, dataStoreGetMetaParam *datastore.DataStoreGetMetaParam) { +func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, dataStoreGetCourseRecordParams []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, dataStoreGetMetaParam *datastore_types.DataStoreGetMetaParam) { // TODO: complete this rmcResponseStream := nex.NewStreamOut(globals.NEXServer) diff --git a/nex/datastore/super-mario-maker/get_object_infos.go b/nex/datastore/super-mario-maker/get_object_infos.go index 4399bd4..f563cbd 100644 --- a/nex/datastore/super-mario-maker/get_object_infos.go +++ b/nex/datastore/super-mario-maker/get_object_infos.go @@ -5,25 +5,26 @@ import ( "os" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint64) { - pInfos := make([]*datastore_super_mario_maker.DataStoreFileServerObjectInfo, 0) + pInfos := make([]*datastore_super_mario_maker_types.DataStoreFileServerObjectInfo, 0) courseMetadatas := database.GetCourseMetadataByDataIDs(dataIDs) for _, courseMetadata := range courseMetadatas { - info := datastore_super_mario_maker.NewDataStoreFileServerObjectInfo() + info := datastore_super_mario_maker_types.NewDataStoreFileServerObjectInfo() info.DataID = courseMetadata.DataID - info.GetInfo = datastore.NewDataStoreReqGetInfo() + info.GetInfo = datastore_types.NewDataStoreReqGetInfo() info.GetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/course/%d.bin", os.Getenv("S3_BUCKET_NAME"), courseMetadata.DataID) - info.GetInfo.RequestHeaders = []*datastore.DataStoreKeyValue{} + info.GetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} info.GetInfo.Size = courseMetadata.Size - info.GetInfo.RootCA = []byte{} + info.GetInfo.RootCACert = []byte{} info.GetInfo.DataID = courseMetadata.DataID pInfos = append(pInfos, info) diff --git a/nex/datastore/super-mario-maker/prepare_attach_file.go b/nex/datastore/super-mario-maker/prepare_attach_file.go index 1a2666e..fdcbad0 100644 --- a/nex/datastore/super-mario-maker/prepare_attach_file.go +++ b/nex/datastore/super-mario-maker/prepare_attach_file.go @@ -10,12 +10,13 @@ import ( "time" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAttachFileParam *datastore_super_mario_maker.DataStoreAttachFileParam) { +func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAttachFileParam *datastore_super_mario_maker_types.DataStoreAttachFileParam) { key := fmt.Sprintf("image/%d.jpg", dataStoreAttachFileParam.ReferDataID) bucket := os.Getenv("S3_BUCKET_NAME") date := strconv.Itoa(int(time.Now().Unix())) @@ -28,42 +29,42 @@ func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAt signature := hex.EncodeToString(hmac.Sum(nil)) - fieldBucket := datastore.NewDataStoreKeyValue() + fieldBucket := datastore_types.NewDataStoreKeyValue() fieldBucket.Key = "bucket" fieldBucket.Value = bucket - fieldKey := datastore.NewDataStoreKeyValue() + fieldKey := datastore_types.NewDataStoreKeyValue() fieldKey.Key = "key" fieldKey.Value = key - fieldACL := datastore.NewDataStoreKeyValue() + fieldACL := datastore_types.NewDataStoreKeyValue() fieldACL.Key = "acl" fieldACL.Value = "public-read" - fieldContentType := datastore.NewDataStoreKeyValue() + fieldContentType := datastore_types.NewDataStoreKeyValue() fieldContentType.Key = "content-type" fieldContentType.Value = "image/jpeg" - fieldPID := datastore.NewDataStoreKeyValue() + fieldPID := datastore_types.NewDataStoreKeyValue() fieldPID.Key = "pid" fieldPID.Value = pid - fieldDate := datastore.NewDataStoreKeyValue() + fieldDate := datastore_types.NewDataStoreKeyValue() fieldDate.Key = "date" fieldDate.Value = date - fieldSignature := datastore.NewDataStoreKeyValue() + fieldSignature := datastore_types.NewDataStoreKeyValue() fieldSignature.Key = "signature" fieldSignature.Value = signature rmcResponseStream := nex.NewStreamOut(globals.NEXServer) - pReqPostInfo := datastore.NewDataStoreReqPostInfo() + pReqPostInfo := datastore_types.NewDataStoreReqPostInfo() pReqPostInfo.DataID = dataStoreAttachFileParam.ReferDataID pReqPostInfo.URL = os.Getenv("DATASTORE_UPLOAD_URL") - pReqPostInfo.RequestHeaders = []*datastore.DataStoreKeyValue{} - pReqPostInfo.FormFields = []*datastore.DataStoreKeyValue{fieldBucket, fieldKey, fieldACL, fieldContentType, fieldPID, fieldDate, fieldSignature} + pReqPostInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} + pReqPostInfo.FormFields = []*datastore_types.DataStoreKeyValue{fieldBucket, fieldKey, fieldACL, fieldContentType, fieldPID, fieldDate, fieldSignature} pReqPostInfo.RootCACert = []byte{} rmcResponseStream.WriteStructure(pReqPostInfo) diff --git a/nex/datastore/super-mario-maker/rate_custom_ranking.go b/nex/datastore/super-mario-maker/rate_custom_ranking.go index 26c702f..bde3548 100644 --- a/nex/datastore/super-mario-maker/rate_custom_ranking.go +++ b/nex/datastore/super-mario-maker/rate_custom_ranking.go @@ -3,11 +3,12 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker.DataStoreRateCustomRankingParam) { +func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) { /* This has to change. We need to figure out what DataStoreRateCustomRankingParam.applicationId means. diff --git a/nex/datastore/super-mario-maker/recommended_course_search_object.go b/nex/datastore/super-mario-maker/recommended_course_search_object.go index ce06b7b..054d1d8 100644 --- a/nex/datastore/super-mario-maker/recommended_course_search_object.go +++ b/nex/datastore/super-mario-maker/recommended_course_search_object.go @@ -2,17 +2,18 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore.DataStoreSearchParam, extraData []string) { +func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) { // TODO: complete this - pRankingResults := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) + pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) // TEMP FOR SHUTTER TO TEST THINGS if client.PID() == 1049991375 { diff --git a/nex/datastore/super-mario-maker/suggested_course_search_object.go b/nex/datastore/super-mario-maker/suggested_course_search_object.go index 130cdb1..9c03c39 100644 --- a/nex/datastore/super-mario-maker/suggested_course_search_object.go +++ b/nex/datastore/super-mario-maker/suggested_course_search_object.go @@ -4,14 +4,15 @@ import ( "strconv" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore.DataStoreSearchParam, extraData []string) { +func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) { // TODO: complete this courseID, _ := strconv.ParseUint(extraData[0], 0, 64) @@ -20,7 +21,7 @@ func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, p database.IncrementCourseAttemptCount(courseID) // We also know this is when a user attempts a course } - pRankingResults := make([]*datastore_super_mario_maker.DataStoreCustomRankingResult, 0) + pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) courseMetadatas := database.GetCourseMetadatasByLimit(4) // In PCAPs param.minimalRatingFrequency is 4 but is 0 here? diff --git a/nex/datastore/super-mario-maker/upload_course_record.go b/nex/datastore/super-mario-maker/upload_course_record.go index 2726c22..1bae0f4 100644 --- a/nex/datastore/super-mario-maker/upload_course_record.go +++ b/nex/datastore/super-mario-maker/upload_course_record.go @@ -3,11 +3,12 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker.DataStoreUploadCourseRecordParam) { +func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreUploadCourseRecordParam) { database.UpdateCourseWorldRecord(param.DataID, client.PID(), param.Score) rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) diff --git a/nex/register_common_protocols.go b/nex/register_common_protocols.go index 7615dfc..7e36a43 100644 --- a/nex/register_common_protocols.go +++ b/nex/register_common_protocols.go @@ -3,13 +3,8 @@ package nex import ( secureconnection "github.com/PretendoNetwork/nex-protocols-common-go/secure-connection" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - nex_secure_connection_common "github.com/PretendoNetwork/super-mario-maker-secure/nex/secure-connection/common" ) func registerCommonProtocols() { - secureConnectionProtocol := secureconnection.NewCommonSecureConnectionProtocol(globals.NEXServer) - - secureConnectionProtocol.AddConnection(nex_secure_connection_common.AddConnection) // * Stubbed - secureConnectionProtocol.UpdateConnection(nex_secure_connection_common.UpdateConnection) // * Stubbed - secureConnectionProtocol.DoesConnectionExist(nex_secure_connection_common.DoesConnectionExist) // * Stubbed + secureconnection.NewCommonSecureConnectionProtocol(globals.NEXServer) } diff --git a/nex/register_nex_protocols.go b/nex/register_nex_protocols.go index e7f14c9..0e5f734 100644 --- a/nex/register_nex_protocols.go +++ b/nex/register_nex_protocols.go @@ -23,7 +23,7 @@ func registerNEXProtocols() { datastoreSMMProtocol.GetObjectInfos(nex_datastore_super_mario_maker.GetObjectInfos) datastoreSMMProtocol.RateCustomRanking(nex_datastore_super_mario_maker.RateCustomRanking) - datastoreSMMProtocol.GetCustomRankingByDataId(nex_datastore_super_mario_maker.GetCustomRankingByDataId) + datastoreSMMProtocol.GetCustomRankingByDataID(nex_datastore_super_mario_maker.GetCustomRankingByDataID) datastoreSMMProtocol.AddToBufferQueues(nex_datastore_super_mario_maker.AddToBufferQueues) datastoreSMMProtocol.GetBufferQueue(nex_datastore_super_mario_maker.GetBufferQueue) datastoreSMMProtocol.CompleteAttachFile(nex_datastore_super_mario_maker.CompleteAttachFile) diff --git a/nex/secure-connection/common/add_connection.go b/nex/secure-connection/common/add_connection.go deleted file mode 100644 index 0fec3c4..0000000 --- a/nex/secure-connection/common/add_connection.go +++ /dev/null @@ -1,5 +0,0 @@ -package nex_secure_connection_common - -func AddConnection(rvcid uint32, urls []string, ip string, port string) { - // TODO - Stubbed -} diff --git a/nex/secure-connection/common/does_connection_exist.go b/nex/secure-connection/common/does_connection_exist.go deleted file mode 100644 index bc0ba47..0000000 --- a/nex/secure-connection/common/does_connection_exist.go +++ /dev/null @@ -1,7 +0,0 @@ -package nex_secure_connection_common - -func DoesConnectionExist(rvcid uint32) bool { - // TODO - Stubbed - - return false -} diff --git a/nex/secure-connection/common/update_connection.go b/nex/secure-connection/common/update_connection.go deleted file mode 100644 index 7f7b659..0000000 --- a/nex/secure-connection/common/update_connection.go +++ /dev/null @@ -1,5 +0,0 @@ -package nex_secure_connection_common - -func UpdateConnection(rvcid uint32, urls []string, ip string, port string) { - // TODO - Stubbed -} diff --git a/nex/server.go b/nex/server.go index b17c148..430df62 100644 --- a/nex/server.go +++ b/nex/server.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - nex "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) diff --git a/utility/utility.go b/utility/utility.go index 61ad457..5455b65 100644 --- a/utility/utility.go +++ b/utility/utility.go @@ -5,9 +5,9 @@ import ( "encoding/base64" "time" - nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/types" @@ -15,8 +15,8 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" ) -func CourseMetadataToDataStoreCustomRankingResult(courseMetadata *types.CourseMetadata) *datastore_super_mario_maker.DataStoreCustomRankingResult { - rankingResult := datastore_super_mario_maker.NewDataStoreCustomRankingResult() +func CourseMetadataToDataStoreCustomRankingResult(courseMetadata *types.CourseMetadata) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { + rankingResult := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() rankingResult.Order = 0 // unknown rankingResult.Score = courseMetadata.Stars @@ -25,8 +25,8 @@ func CourseMetadataToDataStoreCustomRankingResult(courseMetadata *types.CourseMe return rankingResult } -func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *datastore.DataStoreMetaInfo { - metaInfo := datastore.NewDataStoreMetaInfo() +func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *datastore_types.DataStoreMetaInfo { + metaInfo := datastore_types.NewDataStoreMetaInfo() metaInfo.DataID = courseMetadata.DataID metaInfo.OwnerID = courseMetadata.OwnerPID @@ -34,12 +34,12 @@ func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *da metaInfo.Name = courseMetadata.Name metaInfo.DataType = courseMetadata.DataType metaInfo.MetaBinary = courseMetadata.MetaBinary - metaInfo.Permission = datastore.NewDataStorePermission() + metaInfo.Permission = datastore_types.NewDataStorePermission() metaInfo.Permission.Permission = 0 // unknown - metaInfo.Permission.RecipientIds = []uint32{} - metaInfo.DelPermission = datastore.NewDataStorePermission() + metaInfo.Permission.RecipientIDs = []uint32{} + metaInfo.DelPermission = datastore_types.NewDataStorePermission() metaInfo.DelPermission.Permission = 3 // unknown - metaInfo.DelPermission.RecipientIds = []uint32{} + metaInfo.DelPermission.RecipientIDs = []uint32{} metaInfo.CreatedTime = courseMetadata.CreatedTime metaInfo.UpdatedTime = courseMetadata.UpdatedTime metaInfo.Period = courseMetadata.Period @@ -50,61 +50,61 @@ func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *da metaInfo.ReferredTime = courseMetadata.CreatedTime metaInfo.ExpireTime = nex.NewDateTime(671075926016) // December 31st, year 9999 metaInfo.Tags = []string{""} // unknown - metaInfo.Ratings = []*datastore.DataStoreRatingInfoWithSlot{ - datastore.NewDataStoreRatingInfoWithSlot(), // attempts - datastore.NewDataStoreRatingInfoWithSlot(), // unknown - datastore.NewDataStoreRatingInfoWithSlot(), // completions - datastore.NewDataStoreRatingInfoWithSlot(), // failures - datastore.NewDataStoreRatingInfoWithSlot(), // unknown - datastore.NewDataStoreRatingInfoWithSlot(), // unknown - datastore.NewDataStoreRatingInfoWithSlot(), // unknown + metaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{ + datastore_types.NewDataStoreRatingInfoWithSlot(), // attempts + datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown + datastore_types.NewDataStoreRatingInfoWithSlot(), // completions + datastore_types.NewDataStoreRatingInfoWithSlot(), // failures + datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown + datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown + datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown } // attempts metaInfo.Ratings[0].Slot = 0 - metaInfo.Ratings[0].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[0].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[0].Rating.TotalValue = int64(courseMetadata.Attempts) metaInfo.Ratings[0].Rating.Count = courseMetadata.Attempts metaInfo.Ratings[0].Rating.InitialValue = 0 // unknown metaInfo.Ratings[1].Slot = 1 - metaInfo.Ratings[1].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[1].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[1].Rating.TotalValue = 2 metaInfo.Ratings[1].Rating.Count = 2 metaInfo.Ratings[1].Rating.InitialValue = 0 // completions metaInfo.Ratings[2].Slot = 2 - metaInfo.Ratings[2].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[2].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[2].Rating.TotalValue = int64(courseMetadata.Completions) metaInfo.Ratings[2].Rating.Count = courseMetadata.Completions metaInfo.Ratings[2].Rating.InitialValue = 0 // failures metaInfo.Ratings[3].Slot = 3 - metaInfo.Ratings[3].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[3].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[3].Rating.TotalValue = int64(courseMetadata.Failures) metaInfo.Ratings[3].Rating.Count = courseMetadata.Failures metaInfo.Ratings[3].Rating.InitialValue = 0 // unknown metaInfo.Ratings[4].Slot = 4 - metaInfo.Ratings[4].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[4].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[4].Rating.TotalValue = 5 metaInfo.Ratings[4].Rating.Count = 5 metaInfo.Ratings[4].Rating.InitialValue = 0 // unknown metaInfo.Ratings[5].Slot = 5 - metaInfo.Ratings[5].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[5].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[5].Rating.TotalValue = 6 metaInfo.Ratings[5].Rating.Count = 6 metaInfo.Ratings[5].Rating.InitialValue = 0 // Number of new Miiverse comments metaInfo.Ratings[6].Slot = 6 - metaInfo.Ratings[6].Rating = datastore.NewDataStoreRatingInfo() + metaInfo.Ratings[6].Rating = datastore_types.NewDataStoreRatingInfo() metaInfo.Ratings[6].Rating.TotalValue = 0 metaInfo.Ratings[6].Rating.Count = 0 metaInfo.Ratings[6].Rating.InitialValue = 0 @@ -112,8 +112,8 @@ func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *da return metaInfo } -func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo primitive.M) *datastore_super_mario_maker.DataStoreCustomRankingResult { - rankingResult := datastore_super_mario_maker.NewDataStoreCustomRankingResult() +func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo primitive.M) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { + rankingResult := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() rankingResult.Order = 0 rankingResult.Score = 0 @@ -122,7 +122,7 @@ func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo primitive return rankingResult } -func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo primitive.M) *datastore.DataStoreMetaInfo { +func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo primitive.M) *datastore_types.DataStoreMetaInfo { encodedMiiData := miiInfo["data"].(string) decodedMiiData, _ := base64.StdEncoding.DecodeString(encodedMiiData) @@ -147,19 +147,19 @@ func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo primitive.M) *datast now := uint64(time.Now().Unix()) - metaInfo := datastore.NewDataStoreMetaInfo() + metaInfo := datastore_types.NewDataStoreMetaInfo() metaInfo.DataID = uint64(ownerID) // This isn;t actually a user PID in Nintendo's servers, but it makes it much easier for us to do it this way metaInfo.OwnerID = ownerID metaInfo.Size = 0 metaInfo.Name = miiInfo["name"].(string) metaInfo.DataType = 1 // Mii data type? metaInfo.MetaBinary = metaBinaryStream.Bytes() - metaInfo.Permission = datastore.NewDataStorePermission() + metaInfo.Permission = datastore_types.NewDataStorePermission() metaInfo.Permission.Permission = 0 // idk? - metaInfo.Permission.RecipientIds = []uint32{} - metaInfo.DelPermission = datastore.NewDataStorePermission() + metaInfo.Permission.RecipientIDs = []uint32{} + metaInfo.DelPermission = datastore_types.NewDataStorePermission() metaInfo.DelPermission.Permission = 3 // idk? - metaInfo.DelPermission.RecipientIds = []uint32{} + metaInfo.DelPermission.RecipientIDs = []uint32{} metaInfo.CreatedTime = nex.NewDateTime(now) metaInfo.UpdatedTime = nex.NewDateTime(now) metaInfo.Period = 90 // idk? @@ -170,7 +170,7 @@ func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo primitive.M) *datast metaInfo.ReferredTime = nex.NewDateTime(now) metaInfo.ExpireTime = nex.NewDateTime(now) metaInfo.Tags = []string{"49"} // idk? - metaInfo.Ratings = []*datastore.DataStoreRatingInfoWithSlot{} + metaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} return metaInfo } From da509aac43e5c04e231f9e5bacd181cffa8d1b02 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Tue, 10 Oct 2023 18:16:33 -0400 Subject: [PATCH 03/28] update to latest library versions, again --- globals/globals.go | 3 +- go.mod | 57 +++++---- go.sum | 114 ++++++++++-------- init.go | 30 ++++- nex/datastore/change_meta.go | 6 +- nex/datastore/complete_post_object.go | 6 +- nex/datastore/get_meta.go | 6 +- nex/datastore/get_metas_multiple_param.go | 6 +- nex/datastore/prepare_get_object.go | 15 ++- nex/datastore/prepare_post_object.go | 8 +- nex/datastore/rate_objects.go | 6 +- .../super-mario-maker/add_to_buffer_queues.go | 4 +- .../check_rate_custom_ranking_counter.go | 4 +- .../super-mario-maker/complete_attach_file.go | 4 +- .../ctr_pick_up_course_search_object.go | 4 +- .../followings_latest_course_search_object.go | 4 +- .../get_application_config.go | 4 +- .../get_application_config_string.go | 4 +- .../super-mario-maker/get_buffer_queue.go | 4 +- .../super-mario-maker/get_course_record.go | 4 +- .../get_custom_ranking_by_data_id.go | 4 +- .../super-mario-maker/get_deletion_reason.go | 4 +- .../get_metas_with_course_record.go | 4 +- .../super-mario-maker/get_object_infos.go | 4 +- .../super-mario-maker/prepare_attach_file.go | 6 +- .../super-mario-maker/rate_custom_ranking.go | 4 +- .../recommended_course_search_object.go | 4 +- .../suggested_course_search_object.go | 4 +- .../super-mario-maker/upload_course_record.go | 4 +- nex/message-delivery/deliver_message.go | 4 +- nex/register_nex_protocols.go | 20 ++- nex/server.go | 6 +- utility/utility.go | 4 +- 33 files changed, 234 insertions(+), 131 deletions(-) diff --git a/globals/globals.go b/globals/globals.go index 22539b8..1658215 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -1,6 +1,7 @@ package globals import ( + presign_post "github.com/PretendoNetwork/aws-sdk-presigned-post-go" "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/plogger-go" "github.com/PretendoNetwork/super-mario-maker-secure/database" @@ -10,5 +11,5 @@ import ( var Logger = plogger.NewLogger() var NEXServer *nex.Server var S3Client *s3.Client -var HMACSecret []byte +var S3PresignClient *presign_post.PresignClient var DataStoreIDGenerators []*database.DataStoreIDGenerator diff --git a/go.mod b/go.mod index 7fe0cb0..b97d96f 100644 --- a/go.mod +++ b/go.mod @@ -3,32 +3,40 @@ module github.com/PretendoNetwork/super-mario-maker-secure go 1.19 require ( - github.com/PretendoNetwork/nex-go v1.0.29 - github.com/PretendoNetwork/nex-protocols-common-go v1.0.23 - github.com/PretendoNetwork/nex-protocols-go v1.0.41 - github.com/PretendoNetwork/plogger-go v1.0.3 - github.com/aws/aws-sdk-go-v2/service/s3 v1.37.0 - github.com/gocql/gocql v1.5.2 + github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0 + github.com/PretendoNetwork/nex-go v1.0.41 + github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 + github.com/PretendoNetwork/nex-protocols-go v1.0.54 + github.com/PretendoNetwork/plogger-go v1.0.4 + github.com/aws/aws-sdk-go-v2 v1.21.1 + github.com/aws/aws-sdk-go-v2/config v1.18.44 + github.com/aws/aws-sdk-go-v2/credentials v1.13.42 + github.com/aws/aws-sdk-go-v2/service/s3 v1.40.1 + github.com/gocql/gocql v1.6.0 github.com/joho/godotenv v1.5.1 - go.mongodb.org/mongo-driver v1.12.0 + go.mongodb.org/mongo-driver v1.12.1 ) require ( - github.com/aws/aws-sdk-go-v2 v1.19.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.27 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.30 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.4 // indirect - github.com/aws/smithy-go v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.37 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 // indirect + github.com/aws/smithy-go v1.15.0 // indirect github.com/fatih/color v1.15.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/jwalton/go-supportscolor v1.2.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/montanaflynn/stats v0.7.1 // indirect @@ -37,11 +45,12 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - golang.org/x/crypto v0.11.0 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/crypto v0.14.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/mod v0.13.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index 8397011..0e4c6ce 100644 --- a/go.sum +++ b/go.sum @@ -1,33 +1,49 @@ -github.com/PretendoNetwork/nex-go v1.0.29 h1:Mu/UGpYEt0YHgJR/l+8Ysc5rlX91NE86ab3sMSKpPWo= -github.com/PretendoNetwork/nex-go v1.0.29/go.mod h1:tWfWhrC/DCJuS08jTk0ceOv2R1VtElvKSVv13To6miE= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.23 h1:5nhsCg0NtJ+Wlq4eAxLkpazsBDWOnSHLgpllW3XUeE0= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.23/go.mod h1:WqdDoCdjAHg4cdnIGJCrBQUX/JQIJHbw0D5oQWZ8mfk= -github.com/PretendoNetwork/nex-protocols-go v1.0.41 h1:f4AJxoIgKt5k22IcYF/SM5MazR0/34hmyflZkFt/Hug= -github.com/PretendoNetwork/nex-protocols-go v1.0.41/go.mod h1:DPRCNkz45onV4ySCRJNp2+69NQnRa+SRqeErsnjW6P4= -github.com/PretendoNetwork/plogger-go v1.0.3 h1:KEnrUfPaCn0LFweg8OrhtiDhlN3pclWpNhlmAtmgfB0= -github.com/PretendoNetwork/plogger-go v1.0.3/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= -github.com/aws/aws-sdk-go-v2 v1.19.0 h1:klAT+y3pGFBU/qVf1uzwttpBbiuozJYWzNLHioyDJ+k= -github.com/aws/aws-sdk-go-v2 v1.19.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 h1:hMUCiE3Zi5AHrRNGf5j985u0WyqI6r2NULhUfo0N/No= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35/go.mod h1:ipR5PvpSPqIqL5Mi82BxLnfMkHVbmco8kUwO2xrCi0M= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 h1:yOpYx+FTBdpk/g+sBU6Cb1H0U/TLEcYYp66mYqsPpcc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29/go.mod h1:M/eUABlDbw2uVrdAn+UsI6M727qp2fxkp8K0ejcBDUY= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.27 h1:cZG7psLfqpkB6H+fIrgUDWmlzM474St1LP0jcz272yI= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.27/go.mod h1:ZdjYvJpDlefgh8/hWelJhqgqJeodxu4SmbVsSdBlL7E= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.30 h1:Bje8Xkh2OWpjBdNfXLrnn8eZg569dUQmhgtydxAYyP0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.30/go.mod h1:qQtIBl5OVMfmeQkz8HaVyh5DzFmmFXyvK27UgIgOr4c= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 h1:IiDolu/eLmuB18DRZibj77n1hHQT7z12jnGO7Ze3pLc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29/go.mod h1:fDbkK4o7fpPXWn8YAPmTieAMuB9mk/VgvW64uaUqxd4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.4 h1:hx4WksB0NRQ9utR+2c3gEGzl6uKj3eM6PMQ6tN3lgXs= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.4/go.mod h1:JniVpqvw90sVjNqanGLufrVapWySL28fhBlYgl96Q/w= -github.com/aws/aws-sdk-go-v2/service/s3 v1.37.0 h1:PalLOEGZ/4XfQxpGZFTLaoJSmPoybnqJYotaIZEf/Rg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.37.0/go.mod h1:PwyKKVL0cNkC37QwLcrhyeCrAk+5bY8O2ou7USyAS2A= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0 h1:YWJpAUpZvTXv+GAplbF6gmR7HGN/uAX2LhHseASYFCI= +github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0/go.mod h1:EflPd+1O5Hr5gfGDlWHPL87XkpAMbSFEQY+/NzoWuT4= +github.com/PretendoNetwork/nex-go v1.0.41 h1:TcBb1Bpe2KAB+AXaGX1K9NVQBRtZJIoy4yCvRde2xbI= +github.com/PretendoNetwork/nex-go v1.0.41/go.mod h1:QwHEa165DeVd0xIuthrgc3j6NWXT8lyPSG6t5kC/Shk= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 h1:ErkWga7Uzn4WoDU8Q/Sy+geHy0fF0G/5wFnL5i6hngI= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.28/go.mod h1:4jYhLg+Cb2qhJHyyA+f2OwCrmc98zuTO3JPWK22mIKw= +github.com/PretendoNetwork/nex-protocols-go v1.0.54 h1:nDbGnNpe7F/cwBZBvFFFPS1afZQ4OLpVHfF8t5xug/Y= +github.com/PretendoNetwork/nex-protocols-go v1.0.54/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= +github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= +github.com/PretendoNetwork/plogger-go v1.0.4/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= +github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= +github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 h1:Sc82v7tDQ/vdU1WtuSyzZ1I7y/68j//HJ6uozND1IDs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14/go.mod h1:9NCTOURS8OpxvoAVHq79LK81/zC78hfRWFn+aL0SPcY= +github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= +github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= +github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= +github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.5 h1:8JG9ny0BqBDzmtIzbpaN+eke152ZNsYKApFJ/q29Hxo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.5/go.mod h1:kEDHQApP/ukMO9natNftgUN3NaTsMxK6jb2jjpSMX7Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.37 h1:Mx1zJlYbiUQANWT40koevLvxawGFolmkaP4m+LuyG7M= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.37/go.mod h1:PjKIAMFthKPgG/B8bbRpo3F8jfr2q2L+w3u78jJ12a0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 h1:YXlm7LxwNlauqb2OrinWlcvtsflTzP8GaMvYfQBhoT4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.5 h1:sAAz28SeA7YZl8Yaphjs9tlLsflhdniQPjf3X2cqr4s= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.5/go.mod h1:HC7gNz3VH0p+RvLKK+HqNQv/gHy+1Os3ko/F41s3+aw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.40.1 h1:FqIaVPbs2W8U3fszl2PCL1IDKeRdM7TssjWamL6b2mg= +github.com/aws/aws-sdk-go-v2/service/s3 v1.40.1/go.mod h1:X0e0NCAx4GjOrKro7s9QYy+YEIFhgCkt6gYKVKhZB5Y= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 h1:ASNYk1ypWAxRhJjKS0jBnTUeDl7HROOpeSMu1xDA/I8= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= +github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= @@ -37,8 +53,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/gocql/gocql v1.5.2 h1:WnKf8xRQImcT/KLaEWG2pjEeryDB7K0qQN9mPs1C58Q= -github.com/gocql/gocql v1.5.2/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= +github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= @@ -55,8 +71,8 @@ github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwA github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -85,17 +101,19 @@ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7Jul github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= -go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -103,8 +121,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -115,21 +133,21 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/init.go b/init.go index 9a6e4b8..607abee 100644 --- a/init.go +++ b/init.go @@ -1,12 +1,17 @@ package main import ( - "io/ioutil" + "context" "log" + "os" "runtime" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/joho/godotenv" ) @@ -18,11 +23,32 @@ func init() { log.Fatal("Error loading .env file") } - globals.HMACSecret, err = ioutil.ReadFile("secret.key") + s3Endpoint := os.Getenv("PN_SMM_CONFIG_S3_ENDPOINT") + s3Region := os.Getenv("PN_SMM_CONFIG_S3_REGION") + s3AccessKey := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY") + s3AccessSecret := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_SECRET") + + staticCredentials := credentials.NewStaticCredentialsProvider(s3AccessKey, s3AccessSecret, "") + + endpointResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + return aws.Endpoint{ + URL: s3Endpoint, + }, nil + }) + + cfg, err := config.LoadDefaultConfig( + context.TODO(), + config.WithRegion(s3Region), + config.WithCredentialsProvider(staticCredentials), + config.WithEndpointResolverWithOptions(endpointResolver), + ) + if err != nil { panic(err) } + globals.S3Client = s3.NewFromConfig(cfg) + // Connect to and setup databases database.ConnectAll() createDataStoreIDGenerators() diff --git a/nex/datastore/change_meta.go b/nex/datastore/change_meta.go index 800d0de..707639d 100644 --- a/nex/datastore/change_meta.go +++ b/nex/datastore/change_meta.go @@ -2,12 +2,12 @@ package nex_datastore import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMetaParam *datastore_types.DataStoreChangeMetaParam) { +func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMetaParam *datastore_types.DataStoreChangeMetaParam) uint32 { // STUBBED // TODO: DO SOMETHING WITH THE DATA rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) @@ -27,4 +27,6 @@ func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMet responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/complete_post_object.go b/nex/datastore/complete_post_object.go index f9fd6cb..aea0b99 100644 --- a/nex/datastore/complete_post_object.go +++ b/nex/datastore/complete_post_object.go @@ -2,12 +2,12 @@ package nex_datastore import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) { +func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) uint32 { // TODO: DO SOMETHING WITH THE DATA rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) @@ -27,4 +27,6 @@ func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreC responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/get_meta.go b/nex/datastore/get_meta.go index ae889fe..392ecaa 100644 --- a/nex/datastore/get_meta.go +++ b/nex/datastore/get_meta.go @@ -5,14 +5,14 @@ import ( "os" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func GetMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { +func GetMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) uint32 { switch param.DataID { case 0: // Mii Data getMetaMiiData(client, callID, param) @@ -21,6 +21,8 @@ func GetMeta(err error, client *nex.Client, callID uint32, param *datastore_type default: fmt.Printf("[Warning] DataStoreProtocol::GetMeta Unsupported dataId: %v\n", param.DataID) } + + return 0 } func getMetaMiiData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { diff --git a/nex/datastore/get_metas_multiple_param.go b/nex/datastore/get_metas_multiple_param.go index d6a4330..94a0db2 100644 --- a/nex/datastore/get_metas_multiple_param.go +++ b/nex/datastore/get_metas_multiple_param.go @@ -4,14 +4,14 @@ import ( "fmt" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params []*datastore_types.DataStoreGetMetaParam) { +func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params []*datastore_types.DataStoreGetMetaParam) uint32 { pMetaInfo := make([]*datastore_types.DataStoreMetaInfo, 0) pResults := make([]uint32, 0) @@ -49,6 +49,8 @@ func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } func getMetasMultipleParamMiiData(param *datastore_types.DataStoreGetMetaParam) *datastore_types.DataStoreMetaInfo { diff --git a/nex/datastore/prepare_get_object.go b/nex/datastore/prepare_get_object.go index f3a46a1..3ee6675 100644 --- a/nex/datastore/prepare_get_object.go +++ b/nex/datastore/prepare_get_object.go @@ -5,18 +5,23 @@ import ( "os" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePrepareGetParam *datastore_types.DataStorePrepareGetParam) { +func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePrepareGetParam *datastore_types.DataStorePrepareGetParam) uint32 { pReqGetInfo := datastore_types.NewDataStoreReqGetInfo() + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + if dataStorePrepareGetParam.DataID == 900000 { - objectSize, _ := utility.S3ObjectSize(os.Getenv("S3_BUCKET_NAME"), "special/900000.bin") + objectSize, err := utility.S3ObjectSize(bucket, "special/900000.bin") + if err != nil { + globals.Logger.Error(err.Error()) + } pReqGetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/special/900000.bin", "pds-AMAJ-d1") pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} @@ -26,7 +31,7 @@ func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePre } else { courseMetadata := database.GetCourseMetadataByDataID(dataStorePrepareGetParam.DataID) - pReqGetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/course/%d.bin", os.Getenv("S3_BUCKET_NAME"), dataStorePrepareGetParam.DataID) + pReqGetInfo.URL = fmt.Sprintf("https://%s.b-cdn.net/course/%d.bin", bucket, dataStorePrepareGetParam.DataID) pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} pReqGetInfo.Size = courseMetadata.Size pReqGetInfo.RootCACert = []byte{} @@ -56,4 +61,6 @@ func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePre responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go index 27cb53c..98d9d5c 100644 --- a/nex/datastore/prepare_post_object.go +++ b/nex/datastore/prepare_post_object.go @@ -11,13 +11,13 @@ import ( "time" nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePreparePostParam) { +func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePreparePostParam) uint32 { rand.Seed(time.Now().UnixNano()) nodeID := rand.Intn(len(globals.DataStoreIDGenerators)) @@ -38,7 +38,7 @@ func PreparePostObject(err error, client *nex.Client, callID uint32, param *data data := pid + bucket + key + date - hmac := hmac.New(sha256.New, globals.HMACSecret) + hmac := hmac.New(sha256.New, []byte{}) hmac.Write([]byte(data)) signature := hex.EncodeToString(hmac.Sum(nil)) @@ -98,4 +98,6 @@ func PreparePostObject(err error, client *nex.Client, callID uint32, param *data responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/rate_objects.go b/nex/datastore/rate_objects.go index 0330656..9a343de 100644 --- a/nex/datastore/rate_objects.go +++ b/nex/datastore/rate_objects.go @@ -2,12 +2,12 @@ package nex_datastore import ( nex "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore" + datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore_types.DataStoreRatingTarget, params []*datastore_types.DataStoreRateObjectParam, transactional bool, fetchRatings bool) { +func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore_types.DataStoreRatingTarget, params []*datastore_types.DataStoreRateObjectParam, transactional bool, fetchRatings bool) uint32 { // TODO: complete this rmcResponseStream := nex.NewStreamOut(globals.NEXServer) @@ -34,4 +34,6 @@ func RateObjects(err error, client *nex.Client, callID uint32, targets []*datast responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/add_to_buffer_queues.go b/nex/datastore/super-mario-maker/add_to_buffer_queues.go index 3f3f9a9..e581c5c 100644 --- a/nex/datastore/super-mario-maker/add_to_buffer_queues.go +++ b/nex/datastore/super-mario-maker/add_to_buffer_queues.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) { +func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) uint32 { pResults := make([]uint32, 0) for i := 0; i < len(params); i++ { @@ -44,4 +44,6 @@ func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*d responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go index 9965228..0ba9fc2 100644 --- a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go +++ b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, applicationID uint32) { +func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { var isBelowThreshold uint8 switch applicationID { @@ -41,4 +41,6 @@ func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 3c6221e..920584f 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -10,7 +10,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) { +func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) uint32 { rmcResponseStream := nex.NewStreamOut(globals.NEXServer) // TODO: complete this @@ -36,4 +36,6 @@ func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreC responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go index 17d58fc..6db076f 100644 --- a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go +++ b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go @@ -12,7 +12,7 @@ import ( // This is the same as DataStoreSMM::RecommendedCourseSearchObject // Not sure why they used a different method here? -func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) { +func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) uint32 { pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) courseMetadatas := database.GetCourseMetadatasByLimit(100) // In PCAPs param.minimalRatingFrequency is 100 but is 0 here? @@ -44,4 +44,6 @@ func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, d responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go index 268bdb8..40ac63a 100644 --- a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go +++ b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go @@ -10,7 +10,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) { +func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) uint32 { pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) for _, pid := range dataStoreSearchParam.OwnerIDs { @@ -44,4 +44,6 @@ func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID ui responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/get_application_config.go b/nex/datastore/super-mario-maker/get_application_config.go index f825108..289091e 100644 --- a/nex/datastore/super-mario-maker/get_application_config.go +++ b/nex/datastore/super-mario-maker/get_application_config.go @@ -10,7 +10,7 @@ import ( var MAX_COURSE_UPLOADS uint32 = 0x64 // Nintendo has this set to 100, but we can change it if we want -func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicationID uint32) { +func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { config := make([]uint32, 0) @@ -50,6 +50,8 @@ func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicat responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } func getApplicationConfig_Unknown0() []uint32 { diff --git a/nex/datastore/super-mario-maker/get_application_config_string.go b/nex/datastore/super-mario-maker/get_application_config_string.go index 2cd1e36..0605598 100644 --- a/nex/datastore/super-mario-maker/get_application_config_string.go +++ b/nex/datastore/super-mario-maker/get_application_config_string.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetApplicationConfigString(err error, client *nex.Client, callID uint32, applicationID uint32) { +func GetApplicationConfigString(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { // Word blacklists? config := make([]string, 0) @@ -46,6 +46,8 @@ func GetApplicationConfigString(err error, client *nex.Client, callID uint32, ap responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } func getApplicationConfigString_WordBlacklist1() []string { diff --git a/nex/datastore/super-mario-maker/get_buffer_queue.go b/nex/datastore/super-mario-maker/get_buffer_queue.go index bebc2da..d8b5f79 100644 --- a/nex/datastore/super-mario-maker/get_buffer_queue.go +++ b/nex/datastore/super-mario-maker/get_buffer_queue.go @@ -10,7 +10,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) { +func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) uint32 { // TODO: complete this rmcResponseStream := nex.NewStreamOut(globals.NEXServer) @@ -47,4 +47,6 @@ func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datasto responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/get_course_record.go b/nex/datastore/super-mario-maker/get_course_record.go index 6291cf5..b95ba35 100644 --- a/nex/datastore/super-mario-maker/get_course_record.go +++ b/nex/datastore/super-mario-maker/get_course_record.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCourseRecordParam) { +func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCourseRecordParam) uint32 { worldRecord := database.GetCourseWorldRecord(param.DataID) rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) @@ -47,4 +47,6 @@ func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datast responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go index e0206cb..566e8f7 100644 --- a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go +++ b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go @@ -9,7 +9,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) { +func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) uint32 { var pRankingResult []*datastore_super_mario_maker_types.DataStoreCustomRankingResult var pResults []uint32 @@ -50,6 +50,8 @@ func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, para responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } func getCustomRankingByDataIdStarredCourses(pid uint32) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { diff --git a/nex/datastore/super-mario-maker/get_deletion_reason.go b/nex/datastore/super-mario-maker/get_deletion_reason.go index c83559d..2bd1201 100644 --- a/nex/datastore/super-mario-maker/get_deletion_reason.go +++ b/nex/datastore/super-mario-maker/get_deletion_reason.go @@ -6,7 +6,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIdLst []uint64) { +func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIdLst []uint64) uint32 { // TODO: Complete this pDeletionReasons := make([]uint32, 0) @@ -40,4 +40,6 @@ func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIdLst [ responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/get_metas_with_course_record.go b/nex/datastore/super-mario-maker/get_metas_with_course_record.go index acf3da1..3e0a60f 100644 --- a/nex/datastore/super-mario-maker/get_metas_with_course_record.go +++ b/nex/datastore/super-mario-maker/get_metas_with_course_record.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, dataStoreGetCourseRecordParams []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, dataStoreGetMetaParam *datastore_types.DataStoreGetMetaParam) { +func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, dataStoreGetCourseRecordParams []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, dataStoreGetMetaParam *datastore_types.DataStoreGetMetaParam) uint32 { // TODO: complete this rmcResponseStream := nex.NewStreamOut(globals.NEXServer) @@ -36,4 +36,6 @@ func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, data responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/get_object_infos.go b/nex/datastore/super-mario-maker/get_object_infos.go index f563cbd..27c5a23 100644 --- a/nex/datastore/super-mario-maker/get_object_infos.go +++ b/nex/datastore/super-mario-maker/get_object_infos.go @@ -12,7 +12,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint64) { +func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint64) uint32 { pInfos := make([]*datastore_super_mario_maker_types.DataStoreFileServerObjectInfo, 0) courseMetadatas := database.GetCourseMetadataByDataIDs(dataIDs) @@ -53,4 +53,6 @@ func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/prepare_attach_file.go b/nex/datastore/super-mario-maker/prepare_attach_file.go index fdcbad0..13afe5f 100644 --- a/nex/datastore/super-mario-maker/prepare_attach_file.go +++ b/nex/datastore/super-mario-maker/prepare_attach_file.go @@ -16,7 +16,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAttachFileParam *datastore_super_mario_maker_types.DataStoreAttachFileParam) { +func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAttachFileParam *datastore_super_mario_maker_types.DataStoreAttachFileParam) uint32 { key := fmt.Sprintf("image/%d.jpg", dataStoreAttachFileParam.ReferDataID) bucket := os.Getenv("S3_BUCKET_NAME") date := strconv.Itoa(int(time.Now().Unix())) @@ -24,7 +24,7 @@ func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAt data := pid + bucket + key + date - hmac := hmac.New(sha256.New, globals.HMACSecret) + hmac := hmac.New(sha256.New, []byte{}) hmac.Write([]byte(data)) signature := hex.EncodeToString(hmac.Sum(nil)) @@ -88,4 +88,6 @@ func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAt responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/rate_custom_ranking.go b/nex/datastore/super-mario-maker/rate_custom_ranking.go index bde3548..768f3ff 100644 --- a/nex/datastore/super-mario-maker/rate_custom_ranking.go +++ b/nex/datastore/super-mario-maker/rate_custom_ranking.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) { +func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) uint32 { /* This has to change. We need to figure out what DataStoreRateCustomRankingParam.applicationId means. @@ -109,4 +109,6 @@ func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*d responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/recommended_course_search_object.go b/nex/datastore/super-mario-maker/recommended_course_search_object.go index 054d1d8..5d2a8c8 100644 --- a/nex/datastore/super-mario-maker/recommended_course_search_object.go +++ b/nex/datastore/super-mario-maker/recommended_course_search_object.go @@ -10,7 +10,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) { +func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { // TODO: complete this pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) @@ -50,4 +50,6 @@ func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/suggested_course_search_object.go b/nex/datastore/super-mario-maker/suggested_course_search_object.go index 9c03c39..b4e4d95 100644 --- a/nex/datastore/super-mario-maker/suggested_course_search_object.go +++ b/nex/datastore/super-mario-maker/suggested_course_search_object.go @@ -12,7 +12,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) { +func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { // TODO: complete this courseID, _ := strconv.ParseUint(extraData[0], 0, 64) @@ -52,4 +52,6 @@ func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, p responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/datastore/super-mario-maker/upload_course_record.go b/nex/datastore/super-mario-maker/upload_course_record.go index 1bae0f4..ead0951 100644 --- a/nex/datastore/super-mario-maker/upload_course_record.go +++ b/nex/datastore/super-mario-maker/upload_course_record.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreUploadCourseRecordParam) { +func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreUploadCourseRecordParam) uint32 { database.UpdateCourseWorldRecord(param.DataID, client.PID(), param.Score) rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) @@ -28,4 +28,6 @@ func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *dat responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/message-delivery/deliver_message.go b/nex/message-delivery/deliver_message.go index 0be1936..19bfb87 100644 --- a/nex/message-delivery/deliver_message.go +++ b/nex/message-delivery/deliver_message.go @@ -6,7 +6,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage nex.StructureInterface) { +func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage nex.StructureInterface) uint32 { rmcResponse := nex.NewRMCResponse(message_delivery.ProtocolID, callID) rmcResponse.SetSuccess(message_delivery.MethodDeliverMessage, nil) @@ -24,4 +24,6 @@ func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage n responsePacket.AddFlag(nex.FlagReliable) globals.NEXServer.Send(responsePacket) + + return 0 } diff --git a/nex/register_nex_protocols.go b/nex/register_nex_protocols.go index 0e5f734..091f144 100644 --- a/nex/register_nex_protocols.go +++ b/nex/register_nex_protocols.go @@ -1,7 +1,6 @@ package nex import ( - "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" nex_datastore "github.com/PretendoNetwork/super-mario-maker-secure/nex/datastore" @@ -9,18 +8,15 @@ import ( ) func registerNEXProtocols() { - datastoreProtocol := datastore.NewDataStoreProtocol(globals.NEXServer) - - datastoreProtocol.GetMeta(nex_datastore.GetMeta) - datastoreProtocol.PreparePostObject(nex_datastore.PreparePostObject) - datastoreProtocol.PrepareGetObject(nex_datastore.PrepareGetObject) - datastoreProtocol.CompletePostObject(nex_datastore.CompletePostObject) - datastoreProtocol.GetMetasMultipleParam(nex_datastore.GetMetasMultipleParam) - datastoreProtocol.ChangeMeta(nex_datastore.ChangeMeta) - datastoreProtocol.RateObjects(nex_datastore.RateObjects) - - datastoreSMMProtocol := datastore_super_mario_maker.NewDataStoreSuperMarioMakerProtocol(globals.NEXServer) + datastoreSMMProtocol := datastore_super_mario_maker.NewProtocol(globals.NEXServer) + datastoreSMMProtocol.GetMeta(nex_datastore.GetMeta) + datastoreSMMProtocol.PreparePostObject(nex_datastore.PreparePostObject) + datastoreSMMProtocol.PrepareGetObject(nex_datastore.PrepareGetObject) + datastoreSMMProtocol.CompletePostObject(nex_datastore.CompletePostObject) + datastoreSMMProtocol.GetMetasMultipleParam(nex_datastore.GetMetasMultipleParam) + datastoreSMMProtocol.ChangeMeta(nex_datastore.ChangeMeta) + datastoreSMMProtocol.RateObjects(nex_datastore.RateObjects) datastoreSMMProtocol.GetObjectInfos(nex_datastore_super_mario_maker.GetObjectInfos) datastoreSMMProtocol.RateCustomRanking(nex_datastore_super_mario_maker.RateCustomRanking) datastoreSMMProtocol.GetCustomRankingByDataID(nex_datastore_super_mario_maker.GetCustomRankingByDataID) diff --git a/nex/server.go b/nex/server.go index 430df62..18ded65 100644 --- a/nex/server.go +++ b/nex/server.go @@ -12,11 +12,7 @@ func StartNEXServer() { globals.NEXServer = nex.NewServer() globals.NEXServer.SetPRUDPVersion(1) globals.NEXServer.SetPRUDPProtocolMinorVersion(2) - globals.NEXServer.SetDefaultNEXVersion(&nex.NEXVersion{ - Major: 3, - Minor: 8, - Patch: 3, - }) + globals.NEXServer.SetDefaultNEXVersion(nex.NewNEXVersion(3, 8, 3)) globals.NEXServer.SetKerberosPassword(os.Getenv("KERBEROS_PASSWORD")) globals.NEXServer.SetAccessKey("9f2b4678") diff --git a/utility/utility.go b/utility/utility.go index 5455b65..d0955b2 100644 --- a/utility/utility.go +++ b/utility/utility.go @@ -6,8 +6,8 @@ import ( "time" "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/types" From e9aee738396b0bf0448793158c4f489ca0f486a1 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sat, 14 Oct 2023 15:33:17 -0400 Subject: [PATCH 04/28] begin transition to MinIO --- globals/globals.go | 7 +- globals/s3_presigner.go | 42 ++++++++++++ go.mod | 13 ++++ go.sum | 33 ++++++++++ init.go | 29 +++------ nex/datastore/get_meta.go | 2 +- nex/datastore/prepare_get_object.go | 43 +++++++------ nex/datastore/prepare_post_object.go | 57 +++++------------ .../super-mario-maker/complete_attach_file.go | 2 +- .../super-mario-maker/prepare_attach_file.go | 64 +++++-------------- utility/utility.go | 22 ++----- 11 files changed, 162 insertions(+), 152 deletions(-) create mode 100644 globals/s3_presigner.go diff --git a/globals/globals.go b/globals/globals.go index 1658215..ae2e927 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -1,15 +1,14 @@ package globals import ( - presign_post "github.com/PretendoNetwork/aws-sdk-presigned-post-go" "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/plogger-go" "github.com/PretendoNetwork/super-mario-maker-secure/database" - "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/minio/minio-go/v7" ) var Logger = plogger.NewLogger() var NEXServer *nex.Server -var S3Client *s3.Client -var S3PresignClient *presign_post.PresignClient +var MinIOClient *minio.Client +var Presigner *S3Presigner var DataStoreIDGenerators []*database.DataStoreIDGenerator diff --git a/globals/s3_presigner.go b/globals/s3_presigner.go new file mode 100644 index 0000000..231e7d7 --- /dev/null +++ b/globals/s3_presigner.go @@ -0,0 +1,42 @@ +package globals + +import ( + "context" + "net/url" + "os" + "time" + + "github.com/minio/minio-go/v7" +) + +type S3Presigner struct { + minio *minio.Client +} + +func (p *S3Presigner) GetObject(bucket, key string, lifetime time.Duration) (*url.URL, error) { + reqParams := make(url.Values) + + return p.minio.PresignedGetObject(context.Background(), bucket, key, lifetime, reqParams) +} + +func (p *S3Presigner) PostObject(bucket, key string, lifetime time.Duration) (*url.URL, map[string]string, error) { + policy := minio.NewPostPolicy() + + policy.SetBucket(bucket) + policy.SetKey(key) + policy.SetExpires(time.Now().UTC().Add(lifetime).UTC()) + + policy.SetCondition("eq", "$bucket", "pn-amaj-d1") + policy.SetCondition("eq", "$key", "17179869186.bin") + policy.SetCondition("eq", "$x-amz-algorithm", "AWS4-HMAC-SHA256") + policy.SetCondition("starts-with", "$x-amz-credential", os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY")) + policy.SetCondition("starts-with", "$x-amz-date", time.Now().Format("2006-01-02")) + + return p.minio.PresignedPostPolicy(context.Background(), policy) +} + +func NewS3Presigner(minioClient *minio.Client) *S3Presigner { + return &S3Presigner{ + minio: minioClient, + } +} diff --git a/go.mod b/go.mod index b97d96f..8626105 100644 --- a/go.mod +++ b/go.mod @@ -32,14 +32,25 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 // indirect github.com/aws/smithy-go v1.15.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/jwalton/go-supportscolor v1.2.0 // indirect github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/minio-go/v7 v7.0.63 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/montanaflynn/stats v0.7.1 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/superwhiskers/crunch/v3 v3.5.7 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect @@ -48,9 +59,11 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.13.0 // indirect + golang.org/x/net v0.14.0 // indirect golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/go.sum b/go.sum index 0e4c6ce..e70dfcb 100644 --- a/go.sum +++ b/go.sum @@ -51,6 +51,8 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dR github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= @@ -62,17 +64,25 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -83,12 +93,28 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= +github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg= github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -119,6 +145,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= @@ -130,8 +158,10 @@ golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -156,4 +186,7 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/init.go b/init.go index 607abee..f8a2335 100644 --- a/init.go +++ b/init.go @@ -1,18 +1,15 @@ package main import ( - "context" "log" "os" "runtime" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/joho/godotenv" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" ) func init() { @@ -24,30 +21,22 @@ func init() { } s3Endpoint := os.Getenv("PN_SMM_CONFIG_S3_ENDPOINT") - s3Region := os.Getenv("PN_SMM_CONFIG_S3_REGION") + //s3Region := os.Getenv("PN_SMM_CONFIG_S3_REGION") s3AccessKey := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY") s3AccessSecret := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_SECRET") - staticCredentials := credentials.NewStaticCredentialsProvider(s3AccessKey, s3AccessSecret, "") + staticCredentials := credentials.NewStaticV4(s3AccessKey, s3AccessSecret, "") - endpointResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { - return aws.Endpoint{ - URL: s3Endpoint, - }, nil + minIOClient, err := minio.New(s3Endpoint, &minio.Options{ + Creds: staticCredentials, + Secure: true, }) - - cfg, err := config.LoadDefaultConfig( - context.TODO(), - config.WithRegion(s3Region), - config.WithCredentialsProvider(staticCredentials), - config.WithEndpointResolverWithOptions(endpointResolver), - ) - if err != nil { panic(err) } - globals.S3Client = s3.NewFromConfig(cfg) + globals.MinIOClient = minIOClient + globals.Presigner = globals.NewS3Presigner(globals.MinIOClient) // Connect to and setup databases database.ConnectAll() diff --git a/nex/datastore/get_meta.go b/nex/datastore/get_meta.go index 392ecaa..4b97efd 100644 --- a/nex/datastore/get_meta.go +++ b/nex/datastore/get_meta.go @@ -55,7 +55,7 @@ func getMetaMiiData(client *nex.Client, callID uint32, param *datastore_types.Da } func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { - objectSize, _ := utility.S3ObjectSize(os.Getenv("S3_BUCKET_NAME"), "special/900000.bin") + objectSize, _ := utility.S3ObjectSize(os.Getenv("PN_SMM_CONFIG_S3_BUCKET"), "900000.bin") pMetaInfo := datastore_types.NewDataStoreMetaInfo() pMetaInfo.DataID = 900000 diff --git a/nex/datastore/prepare_get_object.go b/nex/datastore/prepare_get_object.go index 3ee6675..8340db0 100644 --- a/nex/datastore/prepare_get_object.go +++ b/nex/datastore/prepare_get_object.go @@ -3,41 +3,44 @@ package nex_datastore import ( "fmt" "os" + "time" nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePrepareGetParam *datastore_types.DataStorePrepareGetParam) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.Core.Unknown + } + pReqGetInfo := datastore_types.NewDataStoreReqGetInfo() bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.bin", dataStorePrepareGetParam.DataID) - if dataStorePrepareGetParam.DataID == 900000 { - objectSize, err := utility.S3ObjectSize(bucket, "special/900000.bin") - if err != nil { - globals.Logger.Error(err.Error()) - } - - pReqGetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/special/900000.bin", "pds-AMAJ-d1") - pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqGetInfo.Size = uint32(objectSize) - pReqGetInfo.RootCACert = []byte{} - pReqGetInfo.DataID = 900000 - } else { - courseMetadata := database.GetCourseMetadataByDataID(dataStorePrepareGetParam.DataID) - - pReqGetInfo.URL = fmt.Sprintf("https://%s.b-cdn.net/course/%d.bin", bucket, dataStorePrepareGetParam.DataID) - pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqGetInfo.Size = courseMetadata.Size - pReqGetInfo.RootCACert = []byte{} - pReqGetInfo.DataID = dataStorePrepareGetParam.DataID + objectSize, err := utility.S3ObjectSize(bucket, key) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.NotFound } + URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.OperationNotAllowed + } + + pReqGetInfo.URL = URL.String() + pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} + pReqGetInfo.Size = uint32(objectSize) + pReqGetInfo.RootCACert = []byte{} + pReqGetInfo.DataID = dataStorePrepareGetParam.DataID + rmcResponseStream := nex.NewStreamOut(globals.NEXServer) rmcResponseStream.WriteStructure(pReqGetInfo) diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go index 98d9d5c..3ef49d6 100644 --- a/nex/datastore/prepare_post_object.go +++ b/nex/datastore/prepare_post_object.go @@ -1,13 +1,9 @@ package nex_datastore import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" "fmt" "math/rand" "os" - "strconv" "time" nex "github.com/PretendoNetwork/nex-go" @@ -31,52 +27,29 @@ func PreparePostObject(err error, client *nex.Client, callID uint32, param *data database.UpdateCourseMetaBinary(dataID, param.MetaBinary) } - key := fmt.Sprintf("course/%d.bin", dataID) - bucket := os.Getenv("S3_BUCKET_NAME") - date := strconv.Itoa(int(time.Now().Unix())) - pid := strconv.Itoa(int(client.PID())) + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.bin", dataID) - data := pid + bucket + key + date - - hmac := hmac.New(sha256.New, []byte{}) - hmac.Write([]byte(data)) - - signature := hex.EncodeToString(hmac.Sum(nil)) - - fieldBucket := datastore_types.NewDataStoreKeyValue() - fieldBucket.Key = "bucket" - fieldBucket.Value = bucket - - fieldKey := datastore_types.NewDataStoreKeyValue() - fieldKey.Key = "key" - fieldKey.Value = key - - fieldACL := datastore_types.NewDataStoreKeyValue() - fieldACL.Key = "acl" - fieldACL.Value = "private" - - fieldPID := datastore_types.NewDataStoreKeyValue() - fieldPID.Key = "pid" - fieldPID.Value = pid - - fieldDate := datastore_types.NewDataStoreKeyValue() - fieldDate.Key = "date" - fieldDate.Value = date - - fieldSignature := datastore_types.NewDataStoreKeyValue() - fieldSignature.Key = "signature" - fieldSignature.Value = signature - - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + URL, formData, _ := globals.Presigner.PostObject(bucket, key, time.Minute*15) pReqPostInfo := datastore_types.NewDataStoreReqPostInfo() pReqPostInfo.DataID = dataID - pReqPostInfo.URL = os.Getenv("DATASTORE_UPLOAD_URL") + pReqPostInfo.URL = URL.String() pReqPostInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqPostInfo.FormFields = []*datastore_types.DataStoreKeyValue{fieldBucket, fieldKey, fieldACL, fieldPID, fieldDate, fieldSignature} + pReqPostInfo.FormFields = make([]*datastore_types.DataStoreKeyValue, 0, len(formData)) pReqPostInfo.RootCACert = []byte{} + for key, value := range formData { + field := datastore_types.NewDataStoreKeyValue() + field.Key = key + field.Value = value + + pReqPostInfo.FormFields = append(pReqPostInfo.FormFields, field) + } + + rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream.WriteStructure(pReqPostInfo) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 920584f..17453df 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -15,7 +15,7 @@ func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreC // TODO: complete this - rmcResponseStream.WriteString(fmt.Sprintf("http://%s.b-cdn.net/image/%d.jpg", os.Getenv("S3_BUCKET_NAME"), dataStoreCompletePostParam.DataID)) + rmcResponseStream.WriteString(fmt.Sprintf("http://%s.b-cdn.net/image/%d.jpg", os.Getenv("PN_SMM_CONFIG_S3_BUCKET"), dataStoreCompletePostParam.DataID)) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/prepare_attach_file.go b/nex/datastore/super-mario-maker/prepare_attach_file.go index 13afe5f..803256b 100644 --- a/nex/datastore/super-mario-maker/prepare_attach_file.go +++ b/nex/datastore/super-mario-maker/prepare_attach_file.go @@ -1,12 +1,8 @@ package nex_datastore_super_mario_maker import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" "fmt" "os" - "strconv" "time" nex "github.com/PretendoNetwork/nex-go" @@ -17,56 +13,30 @@ import ( ) func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAttachFileParam *datastore_super_mario_maker_types.DataStoreAttachFileParam) uint32 { - key := fmt.Sprintf("image/%d.jpg", dataStoreAttachFileParam.ReferDataID) - bucket := os.Getenv("S3_BUCKET_NAME") - date := strconv.Itoa(int(time.Now().Unix())) - pid := strconv.Itoa(int(client.PID())) + dataID := dataStoreAttachFileParam.ReferDataID + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.jpeg", dataID) - data := pid + bucket + key + date - - hmac := hmac.New(sha256.New, []byte{}) - hmac.Write([]byte(data)) - - signature := hex.EncodeToString(hmac.Sum(nil)) - - fieldBucket := datastore_types.NewDataStoreKeyValue() - fieldBucket.Key = "bucket" - fieldBucket.Value = bucket - - fieldKey := datastore_types.NewDataStoreKeyValue() - fieldKey.Key = "key" - fieldKey.Value = key - - fieldACL := datastore_types.NewDataStoreKeyValue() - fieldACL.Key = "acl" - fieldACL.Value = "public-read" - - fieldContentType := datastore_types.NewDataStoreKeyValue() - fieldContentType.Key = "content-type" - fieldContentType.Value = "image/jpeg" - - fieldPID := datastore_types.NewDataStoreKeyValue() - fieldPID.Key = "pid" - fieldPID.Value = pid - - fieldDate := datastore_types.NewDataStoreKeyValue() - fieldDate.Key = "date" - fieldDate.Value = date - - fieldSignature := datastore_types.NewDataStoreKeyValue() - fieldSignature.Key = "signature" - fieldSignature.Value = signature - - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + URL, formData, _ := globals.Presigner.PostObject(bucket, key, time.Minute*15) pReqPostInfo := datastore_types.NewDataStoreReqPostInfo() - pReqPostInfo.DataID = dataStoreAttachFileParam.ReferDataID - pReqPostInfo.URL = os.Getenv("DATASTORE_UPLOAD_URL") + pReqPostInfo.DataID = dataID + pReqPostInfo.URL = URL.String() pReqPostInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqPostInfo.FormFields = []*datastore_types.DataStoreKeyValue{fieldBucket, fieldKey, fieldACL, fieldContentType, fieldPID, fieldDate, fieldSignature} + pReqPostInfo.FormFields = make([]*datastore_types.DataStoreKeyValue, 0, len(formData)) pReqPostInfo.RootCACert = []byte{} + for key, value := range formData { + field := datastore_types.NewDataStoreKeyValue() + field.Key = key + field.Value = value + + pReqPostInfo.FormFields = append(pReqPostInfo.FormFields, field) + } + + rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream.WriteStructure(pReqPostInfo) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/utility/utility.go b/utility/utility.go index d0955b2..a272d5b 100644 --- a/utility/utility.go +++ b/utility/utility.go @@ -11,7 +11,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/types" - "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/minio/minio-go/v7" "go.mongodb.org/mongo-driver/bson/primitive" ) @@ -181,27 +181,15 @@ func UserNotOwnCourse(courseID uint64, pid uint32) bool { return courseMetadata.OwnerPID != pid } -func S3HeadRequest(bucket, key string) (*s3.HeadObjectOutput, error) { - input := &s3.HeadObjectInput{ - Bucket: &bucket, - Key: &key, - } - - res, err := globals.S3Client.HeadObject(context.TODO(), input) - - if err != nil { - return nil, err - } - - return res, nil +func S3StatObject(bucket, key string) (minio.ObjectInfo, error) { + return globals.MinIOClient.StatObject(context.TODO(), bucket, key, minio.StatObjectOptions{}) } func S3ObjectSize(bucket, key string) (uint64, error) { - res, err := S3HeadRequest(bucket, key) - + info, err := S3StatObject(bucket, key) if err != nil { return 0, err } - return uint64(res.ContentLength), nil + return uint64(info.Size), nil } From d6c1d64f1dde348ad73f09c1fc768b1b34dccac1 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:29:57 -0700 Subject: [PATCH 05/28] Update nex-protocols-go library version --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 8626105..5a15ffb 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0 github.com/PretendoNetwork/nex-go v1.0.41 github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 - github.com/PretendoNetwork/nex-protocols-go v1.0.54 + github.com/PretendoNetwork/nex-protocols-go v1.0.55 github.com/PretendoNetwork/plogger-go v1.0.4 github.com/aws/aws-sdk-go-v2 v1.21.1 github.com/aws/aws-sdk-go-v2/config v1.18.44 From 05707d9d47aa612e6218ed3fdbdc2de3c7ed7168 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:31:12 -0700 Subject: [PATCH 06/28] Switch from aws-sdk to minio, import grpc --- go.mod | 26 ++++++------------------ go.sum | 63 +++++++++++++++++++--------------------------------------- 2 files changed, 26 insertions(+), 63 deletions(-) diff --git a/go.mod b/go.mod index 5a15ffb..efaa67a 100644 --- a/go.mod +++ b/go.mod @@ -3,37 +3,22 @@ module github.com/PretendoNetwork/super-mario-maker-secure go 1.19 require ( - github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0 + github.com/PretendoNetwork/grpc-go v1.0.2 github.com/PretendoNetwork/nex-go v1.0.41 github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 github.com/PretendoNetwork/nex-protocols-go v1.0.55 github.com/PretendoNetwork/plogger-go v1.0.4 - github.com/aws/aws-sdk-go-v2 v1.21.1 - github.com/aws/aws-sdk-go-v2/config v1.18.44 - github.com/aws/aws-sdk-go-v2/credentials v1.13.42 - github.com/aws/aws-sdk-go-v2/service/s3 v1.40.1 github.com/gocql/gocql v1.6.0 github.com/joho/godotenv v1.5.1 + github.com/minio/minio-go/v7 v7.0.63 go.mongodb.org/mongo-driver v1.12.1 + google.golang.org/grpc v1.58.3 ) require ( - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.37 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 // indirect - github.com/aws/smithy-go v1.15.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.15.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect @@ -44,7 +29,6 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/minio/md5-simd v1.1.2 // indirect - github.com/minio/minio-go/v7 v7.0.63 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -64,6 +48,8 @@ require ( golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/go.sum b/go.sum index e70dfcb..603a5f0 100644 --- a/go.sum +++ b/go.sum @@ -1,49 +1,15 @@ -github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0 h1:YWJpAUpZvTXv+GAplbF6gmR7HGN/uAX2LhHseASYFCI= -github.com/PretendoNetwork/aws-sdk-presigned-post-go v1.0.0/go.mod h1:EflPd+1O5Hr5gfGDlWHPL87XkpAMbSFEQY+/NzoWuT4= +github.com/PretendoNetwork/grpc-go v1.0.2 h1:9TvKmX7dCOANyoHEra1MMYqS1N/RGav66TRG4SHInvo= +github.com/PretendoNetwork/grpc-go v1.0.2/go.mod h1:XZjEsij9lL7HJBNkH6JPbBIkUSq/1rjflvjGdv+DAj0= github.com/PretendoNetwork/nex-go v1.0.41 h1:TcBb1Bpe2KAB+AXaGX1K9NVQBRtZJIoy4yCvRde2xbI= github.com/PretendoNetwork/nex-go v1.0.41/go.mod h1:QwHEa165DeVd0xIuthrgc3j6NWXT8lyPSG6t5kC/Shk= github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 h1:ErkWga7Uzn4WoDU8Q/Sy+geHy0fF0G/5wFnL5i6hngI= github.com/PretendoNetwork/nex-protocols-common-go v1.0.28/go.mod h1:4jYhLg+Cb2qhJHyyA+f2OwCrmc98zuTO3JPWK22mIKw= github.com/PretendoNetwork/nex-protocols-go v1.0.54 h1:nDbGnNpe7F/cwBZBvFFFPS1afZQ4OLpVHfF8t5xug/Y= github.com/PretendoNetwork/nex-protocols-go v1.0.54/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= +github.com/PretendoNetwork/nex-protocols-go v1.0.55 h1:8QMeCNO2eZO4m7CRT/nv2WWm+gDh/REKR5jKTYQaaCs= +github.com/PretendoNetwork/nex-protocols-go v1.0.55/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= github.com/PretendoNetwork/plogger-go v1.0.4/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= -github.com/aws/aws-sdk-go-v2 v1.21.1 h1:wjHYshtPpYOZm+/mu3NhVgRRc0baM6LJZOmxPZ5Cwzs= -github.com/aws/aws-sdk-go-v2 v1.21.1/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 h1:Sc82v7tDQ/vdU1WtuSyzZ1I7y/68j//HJ6uozND1IDs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14/go.mod h1:9NCTOURS8OpxvoAVHq79LK81/zC78hfRWFn+aL0SPcY= -github.com/aws/aws-sdk-go-v2/config v1.18.44 h1:U10NQ3OxiY0dGGozmVIENIDnCT0W432PWxk2VO8wGnY= -github.com/aws/aws-sdk-go-v2/config v1.18.44/go.mod h1:pHxnQBldd0heEdJmolLBk78D1Bf69YnKLY3LOpFImlU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42 h1:KMkjpZqcMOwtRHChVlHdNxTUUAC6NC/b58mRZDIdcRg= -github.com/aws/aws-sdk-go-v2/credentials v1.13.42/go.mod h1:7ltKclhvEB8305sBhrpls24HGxORl6qgnQqSJ314Uw8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12 h1:3j5lrl9kVQrJ1BU4O0z7MQ8sa+UXdiLuo4j0V+odNI8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.12/go.mod h1:JbFpcHDBdsex1zpIKuVRorZSQiZEyc3MykNCcjgz174= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42 h1:817VqVe6wvwE46xXy6YF5RywvjOX6U2zRQQ6IbQFK0s= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.42/go.mod h1:oDfgXoBBmj+kXnqxDDnIDnC56QBosglKp8ftRCTxR+0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36 h1:7ZApaXzWbo8slc+W5TynuUlB4z66g44h7uqa3/d/BsY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.36/go.mod h1:rwr4WnmFi3RJO0M4dxbJtgi9BPLMpVBMX1nUte5ha9U= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44 h1:quOJOqlbSfeJTboXLjYXM1M9T52LBXqLoTPlmsKLpBo= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.44/go.mod h1:LNy+P1+1LiRcCsVYr/4zG5n8zWFL0xsvZkOybjbftm8= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.5 h1:8JG9ny0BqBDzmtIzbpaN+eke152ZNsYKApFJ/q29Hxo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.5/go.mod h1:kEDHQApP/ukMO9natNftgUN3NaTsMxK6jb2jjpSMX7Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.37 h1:Mx1zJlYbiUQANWT40koevLvxawGFolmkaP4m+LuyG7M= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.37/go.mod h1:PjKIAMFthKPgG/B8bbRpo3F8jfr2q2L+w3u78jJ12a0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36 h1:YXlm7LxwNlauqb2OrinWlcvtsflTzP8GaMvYfQBhoT4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.36/go.mod h1:ou9ffqJ9hKOVZmjlC6kQ6oROAyG1M4yBKzR+9BKbDwk= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.5 h1:sAAz28SeA7YZl8Yaphjs9tlLsflhdniQPjf3X2cqr4s= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.5/go.mod h1:HC7gNz3VH0p+RvLKK+HqNQv/gHy+1Os3ko/F41s3+aw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.40.1 h1:FqIaVPbs2W8U3fszl2PCL1IDKeRdM7TssjWamL6b2mg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.40.1/go.mod h1:X0e0NCAx4GjOrKro7s9QYy+YEIFhgCkt6gYKVKhZB5Y= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1 h1:ZN3bxw9OYC5D6umLw6f57rNJfGfhg1DIAAcKpzyUTOE= -github.com/aws/aws-sdk-go-v2/service/sso v1.15.1/go.mod h1:PieckvBoT5HtyB9AsJRrYZFY2Z+EyfVM/9zG6gbV8DQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2 h1:fSCCJuT5i6ht8TqGdZc5Q5K9pz/atrf7qH4iK5C9XzU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.2/go.mod h1:5eNtr+vNc5vVd92q7SJ+U/HszsIdhZBEyi9dkMRKsp8= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.1 h1:ASNYk1ypWAxRhJjKS0jBnTUeDl7HROOpeSMu1xDA/I8= -github.com/aws/aws-sdk-go-v2/service/sts v1.23.1/go.mod h1:2cnsAhVT3mqusovc2stUSUrSBGTcX9nh8Tu6xh//2eI= -github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= -github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= @@ -57,20 +23,21 @@ github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -107,6 +74,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -114,6 +82,7 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg= github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA= @@ -183,10 +152,18 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 67c2f856acdf0aea309a475c8cfa40932c063bbd Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:33:29 -0700 Subject: [PATCH 07/28] Initialize grpc, check for env vars --- init.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/init.go b/init.go index f8a2335..e2f8934 100644 --- a/init.go +++ b/init.go @@ -1,15 +1,22 @@ package main import ( + "fmt" "log" "os" "runtime" + "strconv" + "strings" + pb "github.com/PretendoNetwork/grpc-go/account" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/joho/godotenv" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/metadata" ) func init() { @@ -25,6 +32,84 @@ func init() { s3AccessKey := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY") s3AccessSecret := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_SECRET") + kerberosPassword := os.Getenv("PN_SMM_KERBEROS_PASSWORD") + authenticationServerPort := os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT") + secureServerHost := os.Getenv("PN_SMM_SECURE_SERVER_HOST") + secureServerPort := os.Getenv("PN_SMM_SECURE_SERVER_PORT") + accountGRPCHost := os.Getenv("PN_SMM_ACCOUNT_GRPC_HOST") + accountGRPCPort := os.Getenv("PN_SMM_ACCOUNT_GRPC_PORT") + accountGRPCAPIKey := os.Getenv("PN_SMM_ACCOUNT_GRPC_API_KEY") + + if strings.TrimSpace(kerberosPassword) == "" { + globals.Logger.Warningf("PN_SMM_KERBEROS_PASSWORD environment variable not set. Using default password: %q", globals.KerberosPassword) + } else { + globals.KerberosPassword = kerberosPassword + } + + if strings.TrimSpace(authenticationServerPort) == "" { + globals.Logger.Error("PN_SMM_AUTHENTICATION_SERVER_PORT environment variable not set") + os.Exit(0) + } + + if port, err := strconv.Atoi(authenticationServerPort); err != nil { + globals.Logger.Errorf("PN_SMM_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort) + os.Exit(0) + } else if port < 0 || port > 65535 { + globals.Logger.Errorf("PN_SMM_AUTHENTICATION_SERVER_PORT is not a valid port. Expected 0-65535, got %s", authenticationServerPort) + os.Exit(0) + } + + if strings.TrimSpace(secureServerHost) == "" { + globals.Logger.Error("PN_SMM_SECURE_SERVER_HOST environment variable not set") + os.Exit(0) + } + + if strings.TrimSpace(secureServerPort) == "" { + globals.Logger.Error("PN_SMM_SECURE_SERVER_PORT environment variable not set") + os.Exit(0) + } + + if port, err := strconv.Atoi(secureServerPort); err != nil { + globals.Logger.Errorf("PN_SMM_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort) + os.Exit(0) + } else if port < 0 || port > 65535 { + globals.Logger.Errorf("PN_SMM_SECURE_SERVER_PORT is not a valid port. Expected 0-65535, got %s", secureServerPort) + os.Exit(0) + } + + if strings.TrimSpace(accountGRPCHost) == "" { + globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_HOST environment variable not set") + os.Exit(0) + } + + if strings.TrimSpace(accountGRPCPort) == "" { + globals.Logger.Error("PN_SMM_ACCOUNT_GRPC_PORT environment variable not set") + os.Exit(0) + } + + if port, err := strconv.Atoi(accountGRPCPort); err != nil { + globals.Logger.Errorf("PN_SMM_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort) + os.Exit(0) + } else if port < 0 || port > 65535 { + globals.Logger.Errorf("PN_SMM_ACCOUNT_GRPC_PORT is not a valid port. Expected 0-65535, got %s", accountGRPCPort) + os.Exit(0) + } + + if strings.TrimSpace(accountGRPCAPIKey) == "" { + globals.Logger.Warning("Insecure gRPC server detected. PN_SMM_ACCOUNT_GRPC_API_KEY environment variable not set") + } + + globals.GRPCAccountClientConnection, err = grpc.Dial(fmt.Sprintf("%s:%s", accountGRPCHost, accountGRPCPort), grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + globals.Logger.Criticalf("Failed to connect to account gRPC server: %v", err) + os.Exit(0) + } + + globals.GRPCAccountClient = pb.NewAccountClient(globals.GRPCAccountClientConnection) + globals.GRPCAccountCommonMetadata = metadata.Pairs( + "X-API-Key", accountGRPCAPIKey, + ) + staticCredentials := credentials.NewStaticV4(s3AccessKey, s3AccessSecret, "") minIOClient, err := minio.New(s3Endpoint, &minio.Options{ From 3f49a7ba668ae43b1ac05e271b7c1dc638f5326b Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:35:36 -0700 Subject: [PATCH 08/28] Moved datastore id generator to globals to prevent import loop --- {database => globals}/datastore_id_generator.go | 2 +- globals/globals.go | 2 +- init.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename {database => globals}/datastore_id_generator.go (98%) diff --git a/database/datastore_id_generator.go b/globals/datastore_id_generator.go similarity index 98% rename from database/datastore_id_generator.go rename to globals/datastore_id_generator.go index fcc7297..366fc8c 100644 --- a/database/datastore_id_generator.go +++ b/globals/datastore_id_generator.go @@ -1,4 +1,4 @@ -package database +package globals import ( "encoding/binary" diff --git a/globals/globals.go b/globals/globals.go index ae2e927..83fa37c 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -11,4 +11,4 @@ var Logger = plogger.NewLogger() var NEXServer *nex.Server var MinIOClient *minio.Client var Presigner *S3Presigner -var DataStoreIDGenerators []*database.DataStoreIDGenerator +var DataStoreIDGenerators []*DataStoreIDGenerator diff --git a/init.go b/init.go index e2f8934..80829c8 100644 --- a/init.go +++ b/init.go @@ -129,7 +129,7 @@ func init() { } func createDataStoreIDGenerators() { - globals.DataStoreIDGenerators = make([]*database.DataStoreIDGenerator, 0) + globals.DataStoreIDGenerators = make([]*globals.DataStoreIDGenerator, 0) regionID := 0 // USA for corenum := 0; corenum < runtime.NumCPU(); corenum++ { @@ -137,7 +137,7 @@ func createDataStoreIDGenerators() { lastID := database.GetDataStoreIDGeneratorLastID(corenum) - generator := database.NewDataStoreIDGenerator(uint8(regionID), uint8(corenum), lastID) + generator := globals.NewDataStoreIDGenerator(uint8(regionID), uint8(corenum), lastID) globals.DataStoreIDGenerators = append(globals.DataStoreIDGenerators, generator) } } From 991d7ced2c4cbbaa6006add4afb100167b0489af Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:40:21 -0700 Subject: [PATCH 09/28] Switch from legacy mongo connection to grpc --- database/connect_all.go | 1 - database/connect_mongo.go | 24 ------------------------ database/get_user_mii_info_by_pid.go | 22 +++++++++------------- globals/password_from_pid.go | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 38 deletions(-) delete mode 100644 database/connect_mongo.go create mode 100755 globals/password_from_pid.go diff --git a/database/connect_all.go b/database/connect_all.go index 15ca8b8..da3df6f 100644 --- a/database/connect_all.go +++ b/database/connect_all.go @@ -1,6 +1,5 @@ package database func ConnectAll() { - connectMongo() connectCassandra() } diff --git a/database/connect_mongo.go b/database/connect_mongo.go deleted file mode 100644 index 70ae1fb..0000000 --- a/database/connect_mongo.go +++ /dev/null @@ -1,24 +0,0 @@ -package database - -import ( - "context" - "os" - "time" - - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -var mongoClient *mongo.Client -var mongoContext context.Context -var mongoDatabase *mongo.Database -var mongoCollection *mongo.Collection - -func connectMongo() { - mongoClient, _ = mongo.NewClient(options.Client().ApplyURI(os.Getenv("MONGO_URI"))) - mongoContext, _ = context.WithTimeout(context.Background(), 10*time.Second) - _ = mongoClient.Connect(mongoContext) - - mongoDatabase = mongoClient.Database("pretendo") - mongoCollection = mongoDatabase.Collection("pnids") -} diff --git a/database/get_user_mii_info_by_pid.go b/database/get_user_mii_info_by_pid.go index c4d4582..18288c8 100644 --- a/database/get_user_mii_info_by_pid.go +++ b/database/get_user_mii_info_by_pid.go @@ -3,23 +3,19 @@ package database import ( "context" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + pb "github.com/PretendoNetwork/grpc-go/account" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "google.golang.org/grpc/metadata" ) -func GetUserMiiInfoByPID(pid uint32) bson.M { - var result bson.M - - err := mongoCollection.FindOne(context.TODO(), bson.D{{Key: "pid", Value: pid}}, options.FindOne()).Decode(&result) +func GetUserMiiInfoByPID(pid uint32) *pb.Mii { + ctx := metadata.NewOutgoingContext(context.Background(), globals.GRPCAccountCommonMetadata) + response, err := globals.GRPCAccountClient.GetUserData(ctx, &pb.GetUserDataRequest{Pid: pid}) if err != nil { - if err == mongo.ErrNoDocuments { - return nil - } - - panic(err) + globals.Logger.Error(err.Error()) + return nil } - return result["mii"].(bson.M) + return response.Mii } diff --git a/globals/password_from_pid.go b/globals/password_from_pid.go new file mode 100755 index 0000000..f59823c --- /dev/null +++ b/globals/password_from_pid.go @@ -0,0 +1,22 @@ +package globals + +import ( + "context" + + pb "github.com/PretendoNetwork/grpc-go/account" + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/nex-protocols-go/globals" + "google.golang.org/grpc/metadata" +) + +func PasswordFromPID(pid uint32) (string, uint32) { + ctx := metadata.NewOutgoingContext(context.Background(), GRPCAccountCommonMetadata) + + response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: pid}) + if err != nil { + globals.Logger.Error(err.Error()) + return "", nex.Errors.RendezVous.InvalidUsername + } + + return response.Password, 0 +} From f9a2141224bb9fbd3b9bb8e51260af38d38a1b44 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:41:05 -0700 Subject: [PATCH 10/28] Add grpc to globals --- globals/globals.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/globals/globals.go b/globals/globals.go index 83fa37c..d6f56b7 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -5,6 +5,10 @@ import ( "github.com/PretendoNetwork/plogger-go" "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/minio/minio-go/v7" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + + pb "github.com/PretendoNetwork/grpc-go/account" ) var Logger = plogger.NewLogger() @@ -12,3 +16,6 @@ var NEXServer *nex.Server var MinIOClient *minio.Client var Presigner *S3Presigner var DataStoreIDGenerators []*DataStoreIDGenerator +var GRPCAccountClientConnection *grpc.ClientConn +var GRPCAccountClient pb.AccountClient +var GRPCAccountCommonMetadata metadata.MD From d89195105d2cf7f478b303d59c80ca458ba304c0 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:54:22 -0700 Subject: [PATCH 11/28] Add auth globals, rename secure global --- globals/globals.go | 5 +++-- nex/datastore/change_meta.go | 2 +- nex/datastore/complete_post_object.go | 2 +- nex/datastore/get_meta.go | 8 ++++---- nex/datastore/get_metas_multiple_param.go | 4 ++-- nex/datastore/prepare_get_object.go | 4 ++-- nex/datastore/prepare_post_object.go | 4 ++-- nex/datastore/rate_objects.go | 4 ++-- nex/datastore/super-mario-maker/add_to_buffer_queues.go | 4 ++-- .../check_rate_custom_ranking_counter.go | 4 ++-- nex/datastore/super-mario-maker/complete_attach_file.go | 4 ++-- .../super-mario-maker/ctr_pick_up_course_search_object.go | 4 ++-- .../followings_latest_course_search_object.go | 4 ++-- nex/datastore/super-mario-maker/get_application_config.go | 4 ++-- .../super-mario-maker/get_application_config_string.go | 4 ++-- nex/datastore/super-mario-maker/get_buffer_queue.go | 4 ++-- nex/datastore/super-mario-maker/get_course_record.go | 4 ++-- .../super-mario-maker/get_custom_ranking_by_data_id.go | 4 ++-- nex/datastore/super-mario-maker/get_deletion_reason.go | 4 ++-- .../super-mario-maker/get_metas_with_course_record.go | 4 ++-- nex/datastore/super-mario-maker/get_object_infos.go | 4 ++-- nex/datastore/super-mario-maker/prepare_attach_file.go | 4 ++-- nex/datastore/super-mario-maker/rate_custom_ranking.go | 2 +- .../super-mario-maker/recommended_course_search_object.go | 4 ++-- .../super-mario-maker/suggested_course_search_object.go | 4 ++-- nex/datastore/super-mario-maker/upload_course_record.go | 2 +- nex/message-delivery/deliver_message.go | 2 +- nex/register_nex_protocols.go | 2 +- 28 files changed, 53 insertions(+), 52 deletions(-) diff --git a/globals/globals.go b/globals/globals.go index d6f56b7..b416409 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -3,7 +3,6 @@ package globals import ( "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/plogger-go" - "github.com/PretendoNetwork/super-mario-maker-secure/database" "github.com/minio/minio-go/v7" "google.golang.org/grpc" "google.golang.org/grpc/metadata" @@ -12,7 +11,9 @@ import ( ) var Logger = plogger.NewLogger() -var NEXServer *nex.Server +var KerberosPassword = "password" // * Default password +var AuthenticationServer *nex.Server +var SecureServer *nex.Server var MinIOClient *minio.Client var Presigner *S3Presigner var DataStoreIDGenerators []*DataStoreIDGenerator diff --git a/nex/datastore/change_meta.go b/nex/datastore/change_meta.go index 707639d..d08cefc 100644 --- a/nex/datastore/change_meta.go +++ b/nex/datastore/change_meta.go @@ -26,7 +26,7 @@ func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMet responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/complete_post_object.go b/nex/datastore/complete_post_object.go index aea0b99..c2752bf 100644 --- a/nex/datastore/complete_post_object.go +++ b/nex/datastore/complete_post_object.go @@ -26,7 +26,7 @@ func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreC responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/get_meta.go b/nex/datastore/get_meta.go index 4b97efd..db04102 100644 --- a/nex/datastore/get_meta.go +++ b/nex/datastore/get_meta.go @@ -30,7 +30,7 @@ func getMetaMiiData(client *nex.Client, callID uint32, param *datastore_types.Da pMetaInfo := utility.UserMiiDataToDataStoreMetaInfo(param.PersistenceTarget.OwnerID, miiInfo) - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteStructure(pMetaInfo) rmcResponseBody := rmcResponseStream.Bytes() @@ -51,7 +51,7 @@ func getMetaMiiData(client *nex.Client, callID uint32, param *datastore_types.Da responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) } func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { @@ -82,7 +82,7 @@ func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datast pMetaInfo.Tags = []string{} // idk? pMetaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteStructure(pMetaInfo) rmcResponseBody := rmcResponseStream.Bytes() @@ -103,5 +103,5 @@ func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datast responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) } diff --git a/nex/datastore/get_metas_multiple_param.go b/nex/datastore/get_metas_multiple_param.go index 94a0db2..f7524e5 100644 --- a/nex/datastore/get_metas_multiple_param.go +++ b/nex/datastore/get_metas_multiple_param.go @@ -25,7 +25,7 @@ func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params pResults = append(pResults, 0x690001) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pMetaInfo) rmcResponseStream.WriteListUInt32LE(pResults) @@ -48,7 +48,7 @@ func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/prepare_get_object.go b/nex/datastore/prepare_get_object.go index 8340db0..6f3bb5e 100644 --- a/nex/datastore/prepare_get_object.go +++ b/nex/datastore/prepare_get_object.go @@ -41,7 +41,7 @@ func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePre pReqGetInfo.RootCACert = []byte{} pReqGetInfo.DataID = dataStorePrepareGetParam.DataID - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteStructure(pReqGetInfo) @@ -63,7 +63,7 @@ func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePre responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go index 3ef49d6..d8110a8 100644 --- a/nex/datastore/prepare_post_object.go +++ b/nex/datastore/prepare_post_object.go @@ -48,7 +48,7 @@ func PreparePostObject(err error, client *nex.Client, callID uint32, param *data pReqPostInfo.FormFields = append(pReqPostInfo.FormFields, field) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteStructure(pReqPostInfo) @@ -70,7 +70,7 @@ func PreparePostObject(err error, client *nex.Client, callID uint32, param *data responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/rate_objects.go b/nex/datastore/rate_objects.go index 9a343de..f004a2a 100644 --- a/nex/datastore/rate_objects.go +++ b/nex/datastore/rate_objects.go @@ -10,7 +10,7 @@ import ( func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore_types.DataStoreRatingTarget, params []*datastore_types.DataStoreRateObjectParam, transactional bool, fetchRatings bool) uint32 { // TODO: complete this - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteUInt32LE(0x00000000) // pRatings List length 0 rmcResponseStream.WriteUInt32LE(0x00000000) // pResults List length 0 @@ -33,7 +33,7 @@ func RateObjects(err error, client *nex.Client, callID uint32, targets []*datast responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/add_to_buffer_queues.go b/nex/datastore/super-mario-maker/add_to_buffer_queues.go index e581c5c..b273cd2 100644 --- a/nex/datastore/super-mario-maker/add_to_buffer_queues.go +++ b/nex/datastore/super-mario-maker/add_to_buffer_queues.go @@ -21,7 +21,7 @@ func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*d pResults = append(pResults, 0x690001) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListUInt32LE(pResults) @@ -43,7 +43,7 @@ func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*d responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go index 0ba9fc2..5d3e07b 100644 --- a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go +++ b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go @@ -18,7 +18,7 @@ func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, fmt.Printf("[Warning] DataStoreSMMProtocol::CheckRateCustomRankingCounter Unsupported applicationID: %v\n", applicationID) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteUInt8(isBelowThreshold) @@ -40,7 +40,7 @@ func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 17453df..9c32799 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -11,7 +11,7 @@ import ( ) func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) uint32 { - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) // TODO: complete this @@ -35,7 +35,7 @@ func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreC responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go index 6db076f..e75d446 100644 --- a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go +++ b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go @@ -21,7 +21,7 @@ func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, d pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pRankingResults) @@ -43,7 +43,7 @@ func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, d responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go index 40ac63a..94d200d 100644 --- a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go +++ b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go @@ -21,7 +21,7 @@ func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID ui } } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pRankingResults) @@ -43,7 +43,7 @@ func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID ui responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_application_config.go b/nex/datastore/super-mario-maker/get_application_config.go index 289091e..5253da3 100644 --- a/nex/datastore/super-mario-maker/get_application_config.go +++ b/nex/datastore/super-mario-maker/get_application_config.go @@ -27,7 +27,7 @@ func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicat fmt.Printf("[Warning] DataStoreSMMProtocol::GetApplicationConfig Unsupported applicationID: %v\n", applicationID) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListUInt32LE(config) @@ -49,7 +49,7 @@ func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicat responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_application_config_string.go b/nex/datastore/super-mario-maker/get_application_config_string.go index 0605598..f6d1ff9 100644 --- a/nex/datastore/super-mario-maker/get_application_config_string.go +++ b/nex/datastore/super-mario-maker/get_application_config_string.go @@ -23,7 +23,7 @@ func GetApplicationConfigString(err error, client *nex.Client, callID uint32, ap fmt.Printf("[Warning] DataStoreSMMProtocol::GetApplicationConfigString Unsupported applicationID: %v\n", applicationID) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListString(config) @@ -45,7 +45,7 @@ func GetApplicationConfigString(err error, client *nex.Client, callID uint32, ap responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_buffer_queue.go b/nex/datastore/super-mario-maker/get_buffer_queue.go index d8b5f79..5ed48d7 100644 --- a/nex/datastore/super-mario-maker/get_buffer_queue.go +++ b/nex/datastore/super-mario-maker/get_buffer_queue.go @@ -13,7 +13,7 @@ import ( func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) uint32 { // TODO: complete this - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) var pBufferQueue [][]byte @@ -46,7 +46,7 @@ func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datasto responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_course_record.go b/nex/datastore/super-mario-maker/get_course_record.go index b95ba35..86d3f93 100644 --- a/nex/datastore/super-mario-maker/get_course_record.go +++ b/nex/datastore/super-mario-maker/get_course_record.go @@ -25,7 +25,7 @@ func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datast result.CreatedTime = worldRecord.CreatedTime result.UpdatedTime = worldRecord.UpdatedTime - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteStructure(result) @@ -46,7 +46,7 @@ func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datast responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go index 566e8f7..ed4c3f8 100644 --- a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go +++ b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go @@ -26,7 +26,7 @@ func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, para pRankingResult, pResults = getCustomRankingByDataIdCourseMetadata(param) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pRankingResult) rmcResponseStream.WriteListUInt32LE(pResults) @@ -49,7 +49,7 @@ func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, para responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_deletion_reason.go b/nex/datastore/super-mario-maker/get_deletion_reason.go index 2bd1201..429f7d0 100644 --- a/nex/datastore/super-mario-maker/get_deletion_reason.go +++ b/nex/datastore/super-mario-maker/get_deletion_reason.go @@ -17,7 +17,7 @@ func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIdLst [ pDeletionReasons = append(pDeletionReasons, 0x690007) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListUInt32LE(pDeletionReasons) @@ -39,7 +39,7 @@ func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIdLst [ responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_metas_with_course_record.go b/nex/datastore/super-mario-maker/get_metas_with_course_record.go index 3e0a60f..fb2ad6d 100644 --- a/nex/datastore/super-mario-maker/get_metas_with_course_record.go +++ b/nex/datastore/super-mario-maker/get_metas_with_course_record.go @@ -11,7 +11,7 @@ import ( func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, dataStoreGetCourseRecordParams []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, dataStoreGetMetaParam *datastore_types.DataStoreGetMetaParam) uint32 { // TODO: complete this - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteUInt32LE(0x00000000) // pMetaInfo List length 0 rmcResponseStream.WriteUInt32LE(0x00000000) // pCourseResults List length 0 @@ -35,7 +35,7 @@ func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, data responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/get_object_infos.go b/nex/datastore/super-mario-maker/get_object_infos.go index 27c5a23..09854ef 100644 --- a/nex/datastore/super-mario-maker/get_object_infos.go +++ b/nex/datastore/super-mario-maker/get_object_infos.go @@ -30,7 +30,7 @@ func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint pInfos = append(pInfos, info) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pInfos) @@ -52,7 +52,7 @@ func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/prepare_attach_file.go b/nex/datastore/super-mario-maker/prepare_attach_file.go index 803256b..924acba 100644 --- a/nex/datastore/super-mario-maker/prepare_attach_file.go +++ b/nex/datastore/super-mario-maker/prepare_attach_file.go @@ -35,7 +35,7 @@ func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAt pReqPostInfo.FormFields = append(pReqPostInfo.FormFields, field) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteStructure(pReqPostInfo) @@ -57,7 +57,7 @@ func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAt responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/rate_custom_ranking.go b/nex/datastore/super-mario-maker/rate_custom_ranking.go index 768f3ff..4f97db8 100644 --- a/nex/datastore/super-mario-maker/rate_custom_ranking.go +++ b/nex/datastore/super-mario-maker/rate_custom_ranking.go @@ -108,7 +108,7 @@ func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*d responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/recommended_course_search_object.go b/nex/datastore/super-mario-maker/recommended_course_search_object.go index 5d2a8c8..dda2926 100644 --- a/nex/datastore/super-mario-maker/recommended_course_search_object.go +++ b/nex/datastore/super-mario-maker/recommended_course_search_object.go @@ -27,7 +27,7 @@ func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, } } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pRankingResults) @@ -49,7 +49,7 @@ func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/suggested_course_search_object.go b/nex/datastore/super-mario-maker/suggested_course_search_object.go index b4e4d95..d29a5d1 100644 --- a/nex/datastore/super-mario-maker/suggested_course_search_object.go +++ b/nex/datastore/super-mario-maker/suggested_course_search_object.go @@ -29,7 +29,7 @@ func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, p pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) } - rmcResponseStream := nex.NewStreamOut(globals.NEXServer) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pRankingResults) @@ -51,7 +51,7 @@ func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, p responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/datastore/super-mario-maker/upload_course_record.go b/nex/datastore/super-mario-maker/upload_course_record.go index ead0951..65806f5 100644 --- a/nex/datastore/super-mario-maker/upload_course_record.go +++ b/nex/datastore/super-mario-maker/upload_course_record.go @@ -27,7 +27,7 @@ func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *dat responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/message-delivery/deliver_message.go b/nex/message-delivery/deliver_message.go index 19bfb87..ddbb836 100644 --- a/nex/message-delivery/deliver_message.go +++ b/nex/message-delivery/deliver_message.go @@ -23,7 +23,7 @@ func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage n responsePacket.AddFlag(nex.FlagNeedsAck) responsePacket.AddFlag(nex.FlagReliable) - globals.NEXServer.Send(responsePacket) + globals.SecureServer.Send(responsePacket) return 0 } diff --git a/nex/register_nex_protocols.go b/nex/register_nex_protocols.go index 091f144..a5c869f 100644 --- a/nex/register_nex_protocols.go +++ b/nex/register_nex_protocols.go @@ -8,7 +8,7 @@ import ( ) func registerNEXProtocols() { - datastoreSMMProtocol := datastore_super_mario_maker.NewProtocol(globals.NEXServer) + datastoreSMMProtocol := datastore_super_mario_maker.NewProtocol(globals.SecureServer) datastoreSMMProtocol.GetMeta(nex_datastore.GetMeta) datastoreSMMProtocol.PreparePostObject(nex_datastore.PreparePostObject) From 5998a3118b7928529d89bf57b071eab398afe42e Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:55:28 -0700 Subject: [PATCH 12/28] Add authentication, rename secure --- main.go | 5 +-- nex/authentication.go | 35 +++++++++++++++++++ ..._common_authentication_server_protocols.go | 30 ++++++++++++++++ ...egister_common_secure_server_protocols.go} | 4 +-- nex/secure.go | 33 +++++++++++++++++ nex/server.go | 33 ----------------- 6 files changed, 103 insertions(+), 37 deletions(-) create mode 100644 nex/authentication.go create mode 100755 nex/register_common_authentication_server_protocols.go rename nex/{register_common_protocols.go => register_common_secure_server_protocols.go} (61%) create mode 100644 nex/secure.go delete mode 100644 nex/server.go diff --git a/main.go b/main.go index e1b661d..c010e93 100644 --- a/main.go +++ b/main.go @@ -9,10 +9,11 @@ import ( var wg sync.WaitGroup func main() { - wg.Add(1) + wg.Add(2) // TODO - Add gRPC server - go nex.StartNEXServer() + go nex.StartAuthenticationServer() + go nex.StartSecureServer() wg.Wait() } diff --git a/nex/authentication.go b/nex/authentication.go new file mode 100644 index 0000000..10d913f --- /dev/null +++ b/nex/authentication.go @@ -0,0 +1,35 @@ +package nex + +import ( + "fmt" + "os" + + nex "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +var serverBuildString string + +func StartAuthenticationServer() { + globals.AuthenticationServer = nex.NewServer() + globals.AuthenticationServer.SetPRUDPVersion(1) + globals.AuthenticationServer.SetPRUDPProtocolMinorVersion(2) + globals.AuthenticationServer.SetDefaultNEXVersion(nex.NewNEXVersion(3, 8, 3)) + globals.AuthenticationServer.SetKerberosPassword(globals.KerberosPassword) + globals.AuthenticationServer.SetAccessKey("9f2b4678") + + globals.AuthenticationServer.On("Data", func(packet *nex.PacketV1) { + request := packet.RMCRequest() + + fmt.Println("==SMM1 - Auth==") + fmt.Printf("Protocol ID: %d\n", request.ProtocolID()) + fmt.Printf("Method ID: %d\n", request.MethodID()) + fmt.Println("===============") + }) + + serverBuildString = "build:3_8_29_3022_0" + + registerCommonAuthenticationServerProtocols() + + globals.AuthenticationServer.Listen(fmt.Sprintf(":%s", os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT"))) +} diff --git a/nex/register_common_authentication_server_protocols.go b/nex/register_common_authentication_server_protocols.go new file mode 100755 index 0000000..709d025 --- /dev/null +++ b/nex/register_common_authentication_server_protocols.go @@ -0,0 +1,30 @@ +package nex + +import ( + "os" + "strconv" + + nex "github.com/PretendoNetwork/nex-go" + ticket_granting "github.com/PretendoNetwork/nex-protocols-common-go/ticket-granting" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func registerCommonAuthenticationServerProtocols() { + ticketGrantingProtocol := ticket_granting.NewCommonTicketGrantingProtocol(globals.AuthenticationServer) + + secureStationURL := nex.NewStationURL("") + secureStationURL.SetScheme("prudps") + secureStationURL.SetAddress(os.Getenv("PN_SMM_SECURE_SERVER_HOST")) + port, _ := strconv.ParseUint(os.Getenv("PN_SMM_SECURE_SERVER_PORT"), 10, 32) + secureStationURL.SetPort(uint32(port)) + secureStationURL.SetCID(1) + secureStationURL.SetPID(2) + secureStationURL.SetSID(1) + secureStationURL.SetStream(10) + secureStationURL.SetType(2) + + ticketGrantingProtocol.SetSecureStationURL(secureStationURL) + ticketGrantingProtocol.SetBuildName(serverBuildString) + + globals.AuthenticationServer.SetPasswordFromPIDFunction(globals.PasswordFromPID) +} diff --git a/nex/register_common_protocols.go b/nex/register_common_secure_server_protocols.go similarity index 61% rename from nex/register_common_protocols.go rename to nex/register_common_secure_server_protocols.go index 7e36a43..1f78067 100644 --- a/nex/register_common_protocols.go +++ b/nex/register_common_secure_server_protocols.go @@ -5,6 +5,6 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func registerCommonProtocols() { - secureconnection.NewCommonSecureConnectionProtocol(globals.NEXServer) +func registerCommonSecureProtocols() { + secureconnection.NewCommonSecureConnectionProtocol(globals.SecureServer) } diff --git a/nex/secure.go b/nex/secure.go new file mode 100644 index 0000000..9ffd66d --- /dev/null +++ b/nex/secure.go @@ -0,0 +1,33 @@ +package nex + +import ( + "fmt" + "os" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func StartSecureServer() { + globals.SecureServer = nex.NewServer() + globals.SecureServer.SetPRUDPVersion(1) + globals.SecureServer.SetPRUDPProtocolMinorVersion(2) + globals.SecureServer.SetDefaultNEXVersion(nex.NewNEXVersion(3, 8, 3)) + globals.SecureServer.SetKerberosPassword(globals.KerberosPassword) + globals.SecureServer.SetAccessKey("9f2b4678") + + globals.SecureServer.On("Data", func(packet *nex.PacketV1) { + request := packet.RMCRequest() + + fmt.Println("==SMM1 - Secure==") + fmt.Printf("Protocol ID: %d\n", request.ProtocolID()) + fmt.Printf("Method ID: %d\n", request.MethodID()) + fmt.Println("===============") + }) + + // * Register the common handlers first so that they can be overridden if needed + registerCommonSecureProtocols() + registerNEXProtocols() + + globals.SecureServer.Listen(fmt.Sprintf(":%s", os.Getenv("PN_SMM_SECURE_SERVER_PORT"))) +} diff --git a/nex/server.go b/nex/server.go deleted file mode 100644 index 18ded65..0000000 --- a/nex/server.go +++ /dev/null @@ -1,33 +0,0 @@ -package nex - -import ( - "fmt" - "os" - - "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func StartNEXServer() { - globals.NEXServer = nex.NewServer() - globals.NEXServer.SetPRUDPVersion(1) - globals.NEXServer.SetPRUDPProtocolMinorVersion(2) - globals.NEXServer.SetDefaultNEXVersion(nex.NewNEXVersion(3, 8, 3)) - globals.NEXServer.SetKerberosPassword(os.Getenv("KERBEROS_PASSWORD")) - globals.NEXServer.SetAccessKey("9f2b4678") - - globals.NEXServer.On("Data", func(packet *nex.PacketV1) { - request := packet.RMCRequest() - - fmt.Println("==SMM1 - Secure==") - fmt.Printf("Protocol ID: %#v\n", request.ProtocolID()) - fmt.Printf("Method ID: %#v\n", request.MethodID()) - fmt.Println("===============") - }) - - // * Register the common handlers first so that they can be overridden if needed - registerCommonProtocols() - registerNEXProtocols() - - globals.NEXServer.Listen(":60003") -} From 223f69763e0d31885067f587a40a883e5f641463 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:56:35 -0700 Subject: [PATCH 13/28] Remove conditions from PostPolicy --- globals/s3_presigner.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/globals/s3_presigner.go b/globals/s3_presigner.go index 231e7d7..64dc1da 100644 --- a/globals/s3_presigner.go +++ b/globals/s3_presigner.go @@ -3,7 +3,6 @@ package globals import ( "context" "net/url" - "os" "time" "github.com/minio/minio-go/v7" @@ -26,12 +25,6 @@ func (p *S3Presigner) PostObject(bucket, key string, lifetime time.Duration) (*u policy.SetKey(key) policy.SetExpires(time.Now().UTC().Add(lifetime).UTC()) - policy.SetCondition("eq", "$bucket", "pn-amaj-d1") - policy.SetCondition("eq", "$key", "17179869186.bin") - policy.SetCondition("eq", "$x-amz-algorithm", "AWS4-HMAC-SHA256") - policy.SetCondition("starts-with", "$x-amz-credential", os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY")) - policy.SetCondition("starts-with", "$x-amz-date", time.Now().Format("2006-01-02")) - return p.minio.PresignedPostPolicy(context.Background(), policy) } From 7f97c91bc49a147f6a5267eef43d3998e9149d6b Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:58:23 -0700 Subject: [PATCH 14/28] Switch to grpc --- utility/utility.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/utility/utility.go b/utility/utility.go index a272d5b..918873a 100644 --- a/utility/utility.go +++ b/utility/utility.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "time" + pb "github.com/PretendoNetwork/grpc-go/account" "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" @@ -12,7 +13,6 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/types" "github.com/minio/minio-go/v7" - "go.mongodb.org/mongo-driver/bson/primitive" ) func CourseMetadataToDataStoreCustomRankingResult(courseMetadata *types.CourseMetadata) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { @@ -112,7 +112,7 @@ func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *da return metaInfo } -func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo primitive.M) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { +func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo *pb.Mii) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { rankingResult := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() rankingResult.Order = 0 @@ -122,11 +122,11 @@ func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo primitive return rankingResult } -func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo primitive.M) *datastore_types.DataStoreMetaInfo { - encodedMiiData := miiInfo["data"].(string) +func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo *pb.Mii) *datastore_types.DataStoreMetaInfo { + encodedMiiData := miiInfo.Data decodedMiiData, _ := base64.StdEncoding.DecodeString(encodedMiiData) - metaBinaryStream := nex.NewStreamOut(globals.NEXServer) + metaBinaryStream := nex.NewStreamOut(globals.SecureServer) metaBinaryStream.Grow(140) metaBinaryStream.WriteBytesNext([]byte{ 0x42, 0x50, 0x46, 0x43, // BPFC magic @@ -151,7 +151,7 @@ func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo primitive.M) *datast metaInfo.DataID = uint64(ownerID) // This isn;t actually a user PID in Nintendo's servers, but it makes it much easier for us to do it this way metaInfo.OwnerID = ownerID metaInfo.Size = 0 - metaInfo.Name = miiInfo["name"].(string) + metaInfo.Name = miiInfo.Name metaInfo.DataType = 1 // Mii data type? metaInfo.MetaBinary = metaBinaryStream.Bytes() metaInfo.Permission = datastore_types.NewDataStorePermission() From c5a98d7d3373902768a08ed90b4922e42cdc7f18 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:59:01 -0700 Subject: [PATCH 15/28] Switch from Bunny CDN to direct requests --- nex/datastore/super-mario-maker/get_object_infos.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/nex/datastore/super-mario-maker/get_object_infos.go b/nex/datastore/super-mario-maker/get_object_infos.go index 09854ef..3a2e351 100644 --- a/nex/datastore/super-mario-maker/get_object_infos.go +++ b/nex/datastore/super-mario-maker/get_object_infos.go @@ -3,6 +3,7 @@ package nex_datastore_super_mario_maker import ( "fmt" "os" + "time" nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" @@ -18,10 +19,19 @@ func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint courseMetadatas := database.GetCourseMetadataByDataIDs(dataIDs) for _, courseMetadata := range courseMetadatas { + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.bin", courseMetadata.DataID) + + URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.OperationNotAllowed + } + info := datastore_super_mario_maker_types.NewDataStoreFileServerObjectInfo() info.DataID = courseMetadata.DataID info.GetInfo = datastore_types.NewDataStoreReqGetInfo() - info.GetInfo.URL = fmt.Sprintf("http://%s.b-cdn.net/course/%d.bin", os.Getenv("S3_BUCKET_NAME"), courseMetadata.DataID) + info.GetInfo.URL = URL.String() info.GetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} info.GetInfo.Size = courseMetadata.Size info.GetInfo.RootCACert = []byte{} From 1273af1e581980f97411009f79cc0ab75442d1a8 Mon Sep 17 00:00:00 2001 From: SuperMarioDaBom Date: Sun, 15 Oct 2023 23:59:45 -0700 Subject: [PATCH 16/28] go mod tidy --- go.mod | 7 ------- go.sum | 52 ---------------------------------------------------- 2 files changed, 59 deletions(-) diff --git a/go.mod b/go.mod index efaa67a..a6f62c2 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/gocql/gocql v1.6.0 github.com/joho/godotenv v1.5.1 github.com/minio/minio-go/v7 v7.0.63 - go.mongodb.org/mongo-driver v1.12.1 google.golang.org/grpc v1.58.3 ) @@ -32,19 +31,13 @@ require ( github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.7.1 // indirect github.com/rs/xid v1.5.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/superwhiskers/crunch/v3 v3.5.7 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.13.0 // indirect golang.org/x/net v0.14.0 // indirect - golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect diff --git a/go.sum b/go.sum index 603a5f0..3b4f4df 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,6 @@ github.com/PretendoNetwork/nex-go v1.0.41 h1:TcBb1Bpe2KAB+AXaGX1K9NVQBRtZJIoy4yC github.com/PretendoNetwork/nex-go v1.0.41/go.mod h1:QwHEa165DeVd0xIuthrgc3j6NWXT8lyPSG6t5kC/Shk= github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 h1:ErkWga7Uzn4WoDU8Q/Sy+geHy0fF0G/5wFnL5i6hngI= github.com/PretendoNetwork/nex-protocols-common-go v1.0.28/go.mod h1:4jYhLg+Cb2qhJHyyA+f2OwCrmc98zuTO3JPWK22mIKw= -github.com/PretendoNetwork/nex-protocols-go v1.0.54 h1:nDbGnNpe7F/cwBZBvFFFPS1afZQ4OLpVHfF8t5xug/Y= -github.com/PretendoNetwork/nex-protocols-go v1.0.54/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= github.com/PretendoNetwork/nex-protocols-go v1.0.55 h1:8QMeCNO2eZO4m7CRT/nv2WWm+gDh/REKR5jKTYQaaCs= github.com/PretendoNetwork/nex-protocols-go v1.0.55/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= @@ -26,11 +24,9 @@ github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJr github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -44,7 +40,6 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -71,9 +66,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= -github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= @@ -86,71 +78,27 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg= github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= -github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= -go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= From 33263e61b662e8cb3835c86c58969ac9d10bb1af Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Tue, 17 Oct 2023 12:26:48 -0400 Subject: [PATCH 17/28] err check in presigner for POST --- globals/s3_presigner.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/globals/s3_presigner.go b/globals/s3_presigner.go index 64dc1da..ad7979a 100644 --- a/globals/s3_presigner.go +++ b/globals/s3_presigner.go @@ -21,9 +21,20 @@ func (p *S3Presigner) GetObject(bucket, key string, lifetime time.Duration) (*ur func (p *S3Presigner) PostObject(bucket, key string, lifetime time.Duration) (*url.URL, map[string]string, error) { policy := minio.NewPostPolicy() - policy.SetBucket(bucket) - policy.SetKey(key) - policy.SetExpires(time.Now().UTC().Add(lifetime).UTC()) + err := policy.SetBucket(bucket) + if err != nil { + return nil, nil, err + } + + err = policy.SetKey(key) + if err != nil { + return nil, nil, err + } + + err = policy.SetExpires(time.Now().UTC().Add(lifetime).UTC()) + if err != nil { + return nil, nil, err + } return p.minio.PresignedPostPolicy(context.Background(), policy) } From 7f42de1a8c043c85e02c6db33be2a6a7c7650d88 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Tue, 17 Oct 2023 13:00:16 -0400 Subject: [PATCH 18/28] remove Bunny from CompleteAttachFile --- .../super-mario-maker/complete_attach_file.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 9c32799..4931828 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -3,6 +3,7 @@ package nex_datastore_super_mario_maker import ( "fmt" "os" + "time" nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" @@ -11,11 +12,19 @@ import ( ) func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) uint32 { - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - // TODO: complete this - rmcResponseStream.WriteString(fmt.Sprintf("http://%s.b-cdn.net/image/%d.jpg", os.Getenv("PN_SMM_CONFIG_S3_BUCKET"), dataStoreCompletePostParam.DataID)) + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.bin", dataStoreCompletePostParam.DataID) + URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.OperationNotAllowed + } + + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) + + rmcResponseStream.WriteString(URL.String()) rmcResponseBody := rmcResponseStream.Bytes() From 97d644b4bd2922f74b787eee6bfeda27a4ddc918 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Wed, 18 Oct 2023 17:25:34 -0400 Subject: [PATCH 19/28] added missing MessageDelivery::DeliverMessage handler --- nex/message-delivery/deliver_message.go | 4 ++-- nex/register_nex_protocols.go | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/nex/message-delivery/deliver_message.go b/nex/message-delivery/deliver_message.go index ddbb836..c66e87a 100644 --- a/nex/message-delivery/deliver_message.go +++ b/nex/message-delivery/deliver_message.go @@ -1,4 +1,4 @@ -package main +package nex_message_delivery import ( nex "github.com/PretendoNetwork/nex-go" @@ -6,7 +6,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage nex.StructureInterface) uint32 { +func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage *nex.DataHolder) uint32 { rmcResponse := nex.NewRMCResponse(message_delivery.ProtocolID, callID) rmcResponse.SetSuccess(message_delivery.MethodDeliverMessage, nil) diff --git a/nex/register_nex_protocols.go b/nex/register_nex_protocols.go index a5c869f..20436a8 100644 --- a/nex/register_nex_protocols.go +++ b/nex/register_nex_protocols.go @@ -2,9 +2,11 @@ package nex import ( datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" + message_delivery "github.com/PretendoNetwork/nex-protocols-go/message-delivery" "github.com/PretendoNetwork/super-mario-maker-secure/globals" nex_datastore "github.com/PretendoNetwork/super-mario-maker-secure/nex/datastore" nex_datastore_super_mario_maker "github.com/PretendoNetwork/super-mario-maker-secure/nex/datastore/super-mario-maker" + nex_message_delivery "github.com/PretendoNetwork/super-mario-maker-secure/nex/message-delivery" ) func registerNEXProtocols() { @@ -35,4 +37,8 @@ func registerNEXProtocols() { datastoreSMMProtocol.GetMetasWithCourseRecord(nex_datastore_super_mario_maker.GetMetasWithCourseRecord) datastoreSMMProtocol.CheckRateCustomRankingCounter(nex_datastore_super_mario_maker.CheckRateCustomRankingCounter) datastoreSMMProtocol.CTRPickUpCourseSearchObject(nex_datastore_super_mario_maker.CTRPickUpCourseSearchObject) + + messageDeliveryProtocol := message_delivery.NewProtocol(globals.SecureServer) + + messageDeliveryProtocol.DeliverMessage(nex_message_delivery.DeliverMessage) } From 9a4497287b5ff48c4034d4c984cd65e1504285e7 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Wed, 18 Oct 2023 17:29:12 -0400 Subject: [PATCH 20/28] added Makefile --- Makefile | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c7dea52 --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ +# TODO - Assumes a UNIX-like OS + +RED := $(shell tput setaf 1) +BLUE := $(shell tput setaf 4) +CYAN := $(shell tput setaf 14) +ORANGE := $(shell tput setaf 202) +YELLOW := $(shell tput setaf 214) +RESET := $(shell tput sgr0) + +ifeq ($(shell which go),) +# TODO - Read contents from .git folder instead? +$(error "$(RED)go command not found. Install go to continue $(BLUE)https://go.dev/doc/install$(RESET)") +endif + +ifneq ($(wildcard .git),) +# * .git folder exists, build server build string from repo info +ifeq ($(shell which git),) +# TODO - Read contents from .git folder instead? +$(error "$(RED)git command not found. Install git to continue $(ORANGE)https://git-scm.com/downloads$(RESET)") +endif +$(info "$(CYAN)Building server build string from repository info$(RESET)") +# * Build server build string from repo info +BRANCH := $(shell git rev-parse --abbrev-ref HEAD) +REMOTE_ORIGIN := $(shell git config --get remote.origin.url) + +# * Handle multiple origin URL formats +HTTPS_PREFIX_CHECK := $(shell echo $(REMOTE_ORIGIN) | head -c 8) +HTTP_PREFIX_CHECK := $(shell echo $(REMOTE_ORIGIN) | head -c 7) +GIT@_PREFIX_CHECK := $(shell echo $(REMOTE_ORIGIN) | head -c 4) + +ifeq ($(HTTPS_PREFIX_CHECK), https://) +REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d/ -f4-) +else ifeq ($(HTTP_PREFIX_CHECK), http://) +REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d/ -f4-) +else ifeq ($(GIT@_PREFIX_CHECK), git@) +REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d: -f2-) +else +REMOTE_PATH := $(shell echo $(REMOTE_ORIGIN) | cut -d/ -f2-) +endif + +HASH := $(shell git rev-parse --short HEAD) +SERVER_BUILD := $(BRANCH):$(REMOTE_PATH)@$(HASH) + +else +# * .git folder not present, assume downloaded from zip file and just use folder name +$(info "$(CYAN)git repository not found. Building server build string from folder name$(RESET)") +SERVER_BUILD := super-mario-maker +endif + +# * Final build string +DATE_TIME := $(shell date --iso=seconds) +BUILD_STRING := $(SERVER_BUILD), $(DATE_TIME) + +default: +ifeq ($(wildcard .env),) + $(warning "$(YELLOW).env file not found, environment variables may not be populated correctly$(RESET)") +endif + go get -u + go mod tidy + go build -ldflags "-X 'main.serverBuildString=$(BUILD_STRING)'" -o ./build/super-mario-maker \ No newline at end of file From 817703269b2975be99d8a3fab6e843b5a00732d4 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Wed, 18 Oct 2023 17:29:48 -0400 Subject: [PATCH 21/28] migrate from cassandra to postgres. all courses deleted --- database/connect_all.go | 5 - database/connect_cassandra.go | 122 ------------------ database/connect_postgres.go | 24 ++++ database/create_datastore_id_generator_row.go | 9 -- database/get_buffer_queue_death_data.go | 27 ++-- database/get_course_metadata_by_data_id.go | 9 +- database/get_course_metadatas_by_limit.go | 57 +++++--- database/get_course_metadatas_by_pid.go | 20 ++- database/get_course_world_record.go | 2 +- .../get_datastore_id_generator_last_id.go | 8 -- database/get_user_starred_courses.go | 14 +- database/increment_course_attempt_count.go | 3 +- database/increment_course_clear_count.go | 3 +- database/increment_course_fail_count.go | 3 +- database/increment_course_star_count.go | 3 +- database/init_postgres.go | 100 ++++++++++++++ database/initialize_course_data.go | 49 ++++--- database/insert_buffer_queue_data.go | 3 +- database/set_course_playable.go | 3 +- .../set_datastore_id_generator_last_id.go | 9 -- database/update_course_meta_binary.go | 3 +- database/update_course_world_record.go | 6 +- globals/datastore_id_generator.go | 48 ------- globals/globals.go | 1 - go.mod | 17 +-- go.sum | 44 ++----- init.go | 27 ++-- nex/datastore/prepare_post_object.go | 10 +- .../super-mario-maker/get_course_record.go | 2 +- 29 files changed, 296 insertions(+), 335 deletions(-) delete mode 100644 database/connect_all.go delete mode 100644 database/connect_cassandra.go create mode 100644 database/connect_postgres.go delete mode 100644 database/create_datastore_id_generator_row.go delete mode 100644 database/get_datastore_id_generator_last_id.go create mode 100644 database/init_postgres.go delete mode 100644 database/set_datastore_id_generator_last_id.go delete mode 100644 globals/datastore_id_generator.go diff --git a/database/connect_all.go b/database/connect_all.go deleted file mode 100644 index da3df6f..0000000 --- a/database/connect_all.go +++ /dev/null @@ -1,5 +0,0 @@ -package database - -func ConnectAll() { - connectCassandra() -} diff --git a/database/connect_cassandra.go b/database/connect_cassandra.go deleted file mode 100644 index e86c59f..0000000 --- a/database/connect_cassandra.go +++ /dev/null @@ -1,122 +0,0 @@ -package database - -import ( - "flag" - "fmt" - "log" - "time" - - "github.com/gocql/gocql" -) - -var cluster *gocql.ClusterConfig -var cassandraClusterSession *gocql.Session - -func connectCassandra() { - // Connect to Cassandra - - var err error - - cluster = gocql.NewCluster("127.0.0.1") - cluster.Timeout = 30 * time.Second - - createKeyspace("pretendo_smm") - - cluster.Keyspace = "pretendo_smm" - - cassandraClusterSession, err = cluster.CreateSession() - - if err != nil { - panic(err) - } - - // Create tables if missing - - if err := cassandraClusterSession.Query(`CREATE TABLE IF NOT EXISTS pretendo_smm.courses ( - data_id bigint PRIMARY KEY, - playable boolean, - owner_pid int, - name text, - size int, - creation_date bigint, - update_date bigint, - world_record_first_pid int, - world_record_pid int, - world_record_creation_date bigint, - world_record_update_date bigint, - world_record int, - meta_binary blob, - flag int, - extra_data list, - data_type smallint, - period smallint - )`).Exec(); err != nil { - fmt.Println("pretendo_smm.courses") - log.Fatal(err) - } - - if err := cassandraClusterSession.Query(`CREATE TABLE IF NOT EXISTS pretendo_smm.ratings ( - data_id bigint PRIMARY KEY, - stars counter, - attempts counter, - failures counter, - completions counter - )`).Exec(); err != nil { - fmt.Println("pretendo_smm.ratings") - log.Fatal(err) - } - - if err := cassandraClusterSession.Query(`CREATE TABLE IF NOT EXISTS pretendo_smm.buffer_queues ( - id uuid PRIMARY KEY, - data_id bigint, - slot int, - buffer blob - )`).Exec(); err != nil { - fmt.Println("pretendo_smm.buffer_queues") - log.Fatal(err) - } - - if err := cassandraClusterSession.Query(`CREATE TABLE IF NOT EXISTS pretendo_smm.generator_last_id ( - node_id int PRIMARY KEY, - last_id int - )`).Exec(); err != nil { - fmt.Println("pretendo_smm.generator_last_id") - log.Fatal(err) - } - - if err := cassandraClusterSession.Query(`CREATE TABLE IF NOT EXISTS pretendo_smm.user_play_info ( - pid int PRIMARY KEY, - starred_courses set, - played_courses set - )`).Exec(); err != nil { - fmt.Println("pretendo_smm.user_play_info") - log.Fatal(err) - } - - fmt.Println("Connected to Cassandra") -} - -// Adapted from gocql common_test.go -func createKeyspace(keyspace string) { - flagRF := flag.Int("rf", 1, "replication factor for pretendo_smm keyspace") - - c := *cluster - c.Keyspace = "system" - c.Timeout = 30 * time.Second - - s, err := c.CreateSession() - - if err != nil { - panic(err) - } - - defer s.Close() - - if err := s.Query(fmt.Sprintf(`CREATE KEYSPACE IF NOT EXISTS %s - WITH replication = { - 'class' : 'SimpleStrategy', - 'replication_factor' : %d - }`, keyspace, *flagRF)).Exec(); err != nil { - log.Fatal(err) - } -} diff --git a/database/connect_postgres.go b/database/connect_postgres.go new file mode 100644 index 0000000..97f1f02 --- /dev/null +++ b/database/connect_postgres.go @@ -0,0 +1,24 @@ +package database + +import ( + "database/sql" + "os" + + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + _ "github.com/lib/pq" +) + +var Postgres *sql.DB + +func ConnectPostgres() { + var err error + + Postgres, err = sql.Open("postgres", os.Getenv("PN_SMM_POSTGRES_URI")) + if err != nil { + globals.Logger.Critical(err.Error()) + } + + globals.Logger.Success("Connected to Postgres!") + + initPostgres() +} diff --git a/database/create_datastore_id_generator_row.go b/database/create_datastore_id_generator_row.go deleted file mode 100644 index f9b08f4..0000000 --- a/database/create_datastore_id_generator_row.go +++ /dev/null @@ -1,9 +0,0 @@ -package database - -import "log" - -func CreateDataStoreIDGeneratorRow(nodeID int) { - if err := cassandraClusterSession.Query(`INSERT INTO pretendo_smm.generator_last_id(node_id, last_id) VALUES (?, ?) IF NOT EXISTS`, nodeID, 0).Exec(); err != nil { - log.Fatal(err) - } -} diff --git a/database/get_buffer_queue_death_data.go b/database/get_buffer_queue_death_data.go index 3cb3eda..19a8148 100644 --- a/database/get_buffer_queue_death_data.go +++ b/database/get_buffer_queue_death_data.go @@ -1,19 +1,30 @@ package database -import "log" +import ( + "database/sql" + + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) func GetBufferQueueDeathData(dataID uint64) [][]byte { pBufferQueue := make([][]byte, 0) - var sliceMap []map[string]interface{} - var err error - - if sliceMap, err = cassandraClusterSession.Query(`SELECT buffer FROM pretendo_smm.buffer_queues WHERE data_id=? AND slot=3 ALLOW FILTERING`, dataID).Iter().SliceMap(); err != nil { - log.Fatal(err) + rows, err := Postgres.Query(`SELECT buffer FROM pretendo_smm.buffer_queues WHERE data_id=$1 AND slot=3`, dataID) + if err != nil { + globals.Logger.Critical(err.Error()) + return pBufferQueue } - for _, bufferQueue := range sliceMap { - pBufferQueue = append(pBufferQueue, bufferQueue["buffer"].([]byte)) + for rows.Next() { + var buffer []byte + + err := rows.Scan(&buffer) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + return pBufferQueue + } + + pBufferQueue = append(pBufferQueue, buffer) } return pBufferQueue diff --git a/database/get_course_metadata_by_data_id.go b/database/get_course_metadata_by_data_id.go index a052a10..1fb91da 100644 --- a/database/get_course_metadata_by_data_id.go +++ b/database/get_course_metadata_by_data_id.go @@ -1,11 +1,11 @@ package database import ( + "database/sql" "log" "github.com/PretendoNetwork/nex-go" "github.com/PretendoNetwork/super-mario-maker-secure/types" - "github.com/gocql/gocql" ) func GetCourseMetadataByDataID(dataID uint64) *types.CourseMetadata { @@ -19,10 +19,9 @@ func GetCourseMetadataByDataID(dataID uint64) *types.CourseMetadata { var dataType uint16 var period uint16 - err := cassandraClusterSession.Query(`SELECT owner_pid, size, name, meta_binary, flag, creation_date, update_date, data_type, period FROM pretendo_smm.courses WHERE data_id=?`, dataID).Scan(&ownerPID, &size, &name, &metaBinary, &flag, &createdTime, &updatedTime, &dataType, &period) - + err := Postgres.QueryRow(`SELECT owner_pid, size, name, meta_binary, flag, creation_date, update_date, data_type, period FROM pretendo_smm.courses WHERE data_id=$1`, dataID).Scan(&ownerPID, &size, &name, &metaBinary, &flag, &createdTime, &updatedTime, &dataType, &period) if err != nil { - if err == gocql.ErrNotFound { + if err == sql.ErrNoRows { return nil } else { log.Fatal(err) @@ -34,7 +33,7 @@ func GetCourseMetadataByDataID(dataID uint64) *types.CourseMetadata { var failures uint32 var completions uint32 - _ = cassandraClusterSession.Query(`SELECT stars, attempts, failures, completions FROM pretendo_smm.ratings WHERE data_id=?`, dataID).Scan(&stars, &attempts, &failures, &completions) + _ = Postgres.QueryRow(`SELECT stars, attempts, failures, completions FROM pretendo_smm.ratings WHERE data_id=$1`, dataID).Scan(&stars, &attempts, &failures, &completions) courseMetadata := &types.CourseMetadata{ DataID: dataID, diff --git a/database/get_course_metadatas_by_limit.go b/database/get_course_metadatas_by_limit.go index 3c5d07a..5be8bce 100644 --- a/database/get_course_metadatas_by_limit.go +++ b/database/get_course_metadatas_by_limit.go @@ -1,47 +1,72 @@ package database import ( + "database/sql" "log" "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/types" ) func GetCourseMetadatasByLimit(limit uint32) []*types.CourseMetadata { - var sliceMap []map[string]interface{} - var err error - - if sliceMap, err = cassandraClusterSession.Query(`SELECT data_id, owner_pid, size, name, meta_binary, flag, creation_date, update_date, data_type, period FROM pretendo_smm.courses LIMIT ?`, limit).Iter().SliceMap(); err != nil { + rows, err := Postgres.Query(`SELECT data_id, owner_pid, size, name, meta_binary, flag, creation_date, update_date, data_type, period FROM pretendo_smm.courses LIMIT $1`, limit) + if err != nil { log.Fatal(err) } courseMetadatas := make([]*types.CourseMetadata, 0) - for _, course := range sliceMap { - dataID := uint64(course["data_id"].(int64)) + for rows.Next() { + var dataID uint64 + var ownerPID uint32 + var size uint32 + var name string + var metaBinary []byte + var flag uint32 + var creationDate uint64 + var updateDate uint64 + var dataType uint16 + var period uint16 + + err := rows.Scan( + &dataID, + &ownerPID, + &size, + &name, + &metaBinary, + &flag, + &creationDate, + &updateDate, + &dataType, + &period, + ) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + } var stars uint32 var attempts uint32 var failures uint32 var completions uint32 - _ = cassandraClusterSession.Query(`SELECT stars, attempts, failures, completions FROM pretendo_smm.ratings WHERE data_id=?`, dataID).Scan(&stars, &attempts, &failures, &completions) + _ = Postgres.QueryRow(`SELECT stars, attempts, failures, completions FROM pretendo_smm.ratings WHERE data_id=$1`, dataID).Scan(&stars, &attempts, &failures, &completions) courseMetadata := &types.CourseMetadata{ DataID: dataID, - OwnerPID: uint32(course["owner_pid"].(int)), - Size: uint32(course["size"].(int)), - CreatedTime: nex.NewDateTime(uint64(course["creation_date"].(int64))), - UpdatedTime: nex.NewDateTime(uint64(course["update_date"].(int64))), - Name: course["name"].(string), - MetaBinary: course["meta_binary"].([]byte), + OwnerPID: ownerPID, + Size: size, + CreatedTime: nex.NewDateTime(creationDate), + UpdatedTime: nex.NewDateTime(updateDate), + Name: name, + MetaBinary: metaBinary, Stars: stars, Attempts: attempts, Failures: failures, Completions: completions, - Flag: uint32(course["flag"].(int)), - DataType: uint16(course["data_type"].(int16)), - Period: uint16(course["period"].(int16)), + Flag: flag, + DataType: dataType, + Period: period, } courseMetadatas = append(courseMetadatas, courseMetadata) diff --git a/database/get_course_metadatas_by_pid.go b/database/get_course_metadatas_by_pid.go index bacb4ec..32cba58 100644 --- a/database/get_course_metadatas_by_pid.go +++ b/database/get_course_metadatas_by_pid.go @@ -1,24 +1,30 @@ package database import ( + "database/sql" "log" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" "github.com/PretendoNetwork/super-mario-maker-secure/types" ) func GetCourseMetadatasByPID(pid uint32) []*types.CourseMetadata { courseMetadatas := make([]*types.CourseMetadata, 0) - // TODO: Fix this query? Seems like a weird way of doing this... - var sliceMap []map[string]interface{} - var err error - - if sliceMap, err = cassandraClusterSession.Query(`SELECT data_id FROM pretendo_smm.courses WHERE owner_pid=? ALLOW FILTERING`, pid).Iter().SliceMap(); err != nil { + rows, err := Postgres.Query(`SELECT data_id FROM pretendo_smm.courses WHERE owner_pid=$1`, pid) + if err != nil { log.Fatal(err) } - for _, course := range sliceMap { - dataID := uint64(course["data_id"].(int64)) + for rows.Next() { + var dataID uint64 + + err := rows.Scan(&dataID) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + return courseMetadatas + } + courseMetadatas = append(courseMetadatas, GetCourseMetadataByDataID(dataID)) } diff --git a/database/get_course_world_record.go b/database/get_course_world_record.go index f95fb39..61a6750 100644 --- a/database/get_course_world_record.go +++ b/database/get_course_world_record.go @@ -12,7 +12,7 @@ func GetCourseWorldRecord(dataID uint64) *types.CourseWorldRecord { var worldRecordUpdatedTime uint64 var worldRecord int32 - _ = cassandraClusterSession.Query(`SELECT world_record_first_pid, world_record_pid, world_record_creation_date, world_record_update_date, world_record FROM pretendo_smm.courses WHERE data_id=?`, dataID).Scan(&worldRecordFirstPID, &worldRecordPID, &worldRecordCreatedTime, &worldRecordUpdatedTime, &worldRecord) + _ = Postgres.QueryRow(`SELECT world_record_first_pid, world_record_pid, world_record_creation_date, world_record_update_date, world_record FROM pretendo_smm.courses WHERE data_id=$1`, dataID).Scan(&worldRecordFirstPID, &worldRecordPID, &worldRecordCreatedTime, &worldRecordUpdatedTime, &worldRecord) if worldRecordFirstPID == 0 { return nil diff --git a/database/get_datastore_id_generator_last_id.go b/database/get_datastore_id_generator_last_id.go deleted file mode 100644 index 413f2bb..0000000 --- a/database/get_datastore_id_generator_last_id.go +++ /dev/null @@ -1,8 +0,0 @@ -package database - -func GetDataStoreIDGeneratorLastID(nodeID int) uint32 { - var lastID uint32 - _ = cassandraClusterSession.Query(`SELECT last_id FROM pretendo_smm.generator_last_id WHERE node_id=?`, nodeID).Scan(&lastID) - - return lastID -} diff --git a/database/get_user_starred_courses.go b/database/get_user_starred_courses.go index a2a09ca..47f5239 100644 --- a/database/get_user_starred_courses.go +++ b/database/get_user_starred_courses.go @@ -1,10 +1,20 @@ package database -import "github.com/PretendoNetwork/super-mario-maker-secure/types" +import ( + "log" + + "github.com/PretendoNetwork/super-mario-maker-secure/types" +) func GetUserStarredCourses(pid uint32) []*types.CourseMetadata { var dataIDs []uint64 - _ = cassandraClusterSession.Query(`SELECT starred_courses FROM pretendo_smm.user_play_info WHERE pid=?`, pid).Scan(&dataIDs) + + rows, err := Postgres.Query(`SELECT starred_courses FROM pretendo_smm.user_play_info WHERE pid=$1`, pid) + if err != nil { + log.Fatal(err) + } + + rows.Scan(&dataIDs) return GetCourseMetadataByDataIDs(dataIDs) } diff --git a/database/increment_course_attempt_count.go b/database/increment_course_attempt_count.go index acd18f7..1501b64 100644 --- a/database/increment_course_attempt_count.go +++ b/database/increment_course_attempt_count.go @@ -3,7 +3,8 @@ package database import "log" func IncrementCourseAttemptCount(courseID uint64) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.ratings SET attempts=attempts+1 WHERE data_id=?`, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET attempts=attempts+1 WHERE data_id=$1`, courseID) + if err != nil { log.Fatal(err) } } diff --git a/database/increment_course_clear_count.go b/database/increment_course_clear_count.go index 9ed27b9..cac63bd 100644 --- a/database/increment_course_clear_count.go +++ b/database/increment_course_clear_count.go @@ -3,7 +3,8 @@ package database import "log" func IncrementCourseClearCount(courseID uint64) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.ratings SET completions=completions+1 WHERE data_id=?`, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET completions=completions+1 WHERE data_id=$1`, courseID) + if err != nil { log.Fatal(err) } } diff --git a/database/increment_course_fail_count.go b/database/increment_course_fail_count.go index 3d67413..c9b8e28 100644 --- a/database/increment_course_fail_count.go +++ b/database/increment_course_fail_count.go @@ -3,7 +3,8 @@ package database import "log" func IncrementCourseFailCount(courseID uint64) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.ratings SET failures=failures+1 WHERE data_id=?`, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET failures=failures+1 WHERE data_id=$1`, courseID) + if err != nil { log.Fatal(err) } } diff --git a/database/increment_course_star_count.go b/database/increment_course_star_count.go index 6214414..c97aa66 100644 --- a/database/increment_course_star_count.go +++ b/database/increment_course_star_count.go @@ -3,7 +3,8 @@ package database import "log" func IncrementCourseStarCount(courseID uint64) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.ratings SET stars=stars+1 WHERE data_id=?`, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET stars=stars+1 WHERE data_id=$1`, courseID) + if err != nil { log.Fatal(err) } } diff --git a/database/init_postgres.go b/database/init_postgres.go new file mode 100644 index 0000000..48c2314 --- /dev/null +++ b/database/init_postgres.go @@ -0,0 +1,100 @@ +package database + +import ( + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func initPostgres() { + _, err := Postgres.Exec(`CREATE SCHEMA IF NOT EXISTS pretendo_smm`) + if err != nil { + globals.Logger.Critical(err.Error()) + return + } + + globals.Logger.Success("pretendo_smm Postgres schema created") + + // * Super Mario Maker has non-standard DataID requirements. + // * DataID 900000 is reserved for the event course metadata + // * file, so to prevent a collision eventually, we need to + // * start course IDs AFTER 900000. DataIDs are stored and + // * processed as uint64, however Super Mario Maker can not + // * use the full uint64 range. This is because course share + // * codes are generated from the courses DataID. A course + // * share code is an 8 byte hex string, where the upper 2 + // * bytes are the checksum of the lower 6 bytes. The lower + // * 6 bytes are the courses DataID. Super Mario Maker is + // * only capable of displaying codes up to 0xFFFFFFFFFFFF, + // * essentially truncating DataIDs down to 48 bit integers + // * instead of 64 bit. I doubt we will ever hit even the 32 + // * bit limit, let alone 48, but this is here just in case + _, err = Postgres.Exec(`CREATE SEQUENCE IF NOT EXISTS pretendo_smm.courses_seq + INCREMENT 1 + MINVALUE 1 + MAXVALUE 281474976710656 + START 900001 + CACHE 1`, + ) + if err != nil { + globals.Logger.Critical(err.Error()) + return + } + + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.courses ( + data_id int NOT NULL DEFAULT nextval('pretendo_smm.courses_seq') PRIMARY KEY, + playable boolean, + owner_pid int, + name text, + size int, + creation_date bigint, + update_date bigint, + world_record_first_pid int, + world_record_pid int, + world_record_creation_date bigint, + world_record_update_date bigint, + world_record int, + meta_binary bytea, + flag int, + extra_data text[], + data_type smallint, + period smallint + )`) + if err != nil { + globals.Logger.Critical(err.Error()) + return + } + + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.ratings ( + data_id bigint PRIMARY KEY, + stars serial, + attempts serial, + failures serial, + completions serial + )`) + if err != nil { + globals.Logger.Critical(err.Error()) + return + } + + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.buffer_queues ( + id uuid PRIMARY KEY, + data_id bigint, + slot int, + buffer bytea + )`) + if err != nil { + globals.Logger.Critical(err.Error()) + return + } + + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.user_play_info ( + pid int PRIMARY KEY, + starred_courses bigint[], + played_courses bigint[] + )`) + if err != nil { + globals.Logger.Critical(err.Error()) + return + } + + globals.Logger.Success("Postgres tables created") +} diff --git a/database/initialize_course_data.go b/database/initialize_course_data.go index 34a2493..ac7012a 100644 --- a/database/initialize_course_data.go +++ b/database/initialize_course_data.go @@ -4,14 +4,15 @@ import ( "log" "github.com/PretendoNetwork/nex-go" + "github.com/lib/pq" ) -func InitializeCourseData(courseID uint64, ownerPID uint32, size uint32, name string, flag uint32, extraData []string, dataType uint16, period uint16) { +func InitializeCourseData(ownerPID uint32, size uint32, name string, flag uint32, extraData []string, dataType uint16, period uint16) uint64 { datetime := nex.NewDateTime(0) now := datetime.Now() + var dataID uint64 - if err := cassandraClusterSession.Query(`INSERT INTO pretendo_smm.courses( - data_id, + err := Postgres.QueryRow(`INSERT INTO pretendo_smm.courses( owner_pid, size, name, @@ -29,28 +30,44 @@ func InitializeCourseData(courseID uint64, ownerPID uint32, size uint32, name st period ) VALUES ( - ?, - ?, - ?, - ?, - ?, - ?, + $1, + $2, + $3, + $4, + $5, false, - ?, - ?, + $6, + $7, 0, 0, 0, 0, 0, - ?, - ? - ) IF NOT EXISTS`, - courseID, ownerPID, size, name, flag, extraData, now, now, dataType, period).Exec(); err != nil { + $8, + $9 + ) RETURNING data_id`, ownerPID, size, name, flag, pq.Array(extraData), now, now, dataType, period).Scan(&dataID) + + if err != nil { log.Fatal(err) } - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.ratings SET stars=stars+0, attempts=attempts+0, failures=failures+0, completions=completions+0 WHERE data_id=?`, courseID).Exec(); err != nil { + _, err = Postgres.Exec(`INSERT INTO pretendo_smm.ratings ( + data_id, + stars, + attempts, + failures, + completions + ) + VALUES ( + $1, + 0, + 0, + 0, + 0 + )`, dataID) + if err != nil { log.Fatal(err) } + + return dataID } diff --git a/database/insert_buffer_queue_data.go b/database/insert_buffer_queue_data.go index 2a8b593..612dfe0 100644 --- a/database/insert_buffer_queue_data.go +++ b/database/insert_buffer_queue_data.go @@ -3,7 +3,8 @@ package database import "log" func InsertBufferQueueData(dataID uint64, slot uint32, buffer []byte) { - if err := cassandraClusterSession.Query(`INSERT INTO pretendo_smm.buffer_queues( id, data_id, slot, buffer ) VALUES ( now(), ?, ?, ? ) IF NOT EXISTS`, dataID, slot, buffer).Exec(); err != nil { + _, err := Postgres.Exec(`INSERT INTO pretendo_smm.buffer_queues( id, data_id, slot, buffer ) VALUES ( gen_random_uuid(), $1, $2, $3 ) ON CONFLICT DO NOTHING`, dataID, slot, buffer) + if err != nil { log.Fatal(err) } } diff --git a/database/set_course_playable.go b/database/set_course_playable.go index fed5b2f..d8e3f3b 100644 --- a/database/set_course_playable.go +++ b/database/set_course_playable.go @@ -3,7 +3,8 @@ package database import "log" func SetCoursePlayable(courseID uint64) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.courses SET playable=true WHERE data_id=?`, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET playable=true WHERE data_id=$1`, courseID) + if err != nil { log.Fatal(err) } } diff --git a/database/set_datastore_id_generator_last_id.go b/database/set_datastore_id_generator_last_id.go deleted file mode 100644 index 0eef04a..0000000 --- a/database/set_datastore_id_generator_last_id.go +++ /dev/null @@ -1,9 +0,0 @@ -package database - -import "log" - -func SetDataStoreIDGeneratorLastID(nodeID int, value uint32) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.generator_last_id SET last_id=? WHERE node_id=?`, value, nodeID).Exec(); err != nil { - log.Fatal(err) - } -} diff --git a/database/update_course_meta_binary.go b/database/update_course_meta_binary.go index 39a53e5..b09a3df 100644 --- a/database/update_course_meta_binary.go +++ b/database/update_course_meta_binary.go @@ -3,7 +3,8 @@ package database import "log" func UpdateCourseMetaBinary(courseID uint64, metaBinary []byte) { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.courses SET meta_binary=? WHERE data_id=?`, metaBinary, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET meta_binary=$1 WHERE data_id=$2`, metaBinary, courseID) + if err != nil { log.Fatal(err) } } diff --git a/database/update_course_world_record.go b/database/update_course_world_record.go index 17d1256..749b984 100644 --- a/database/update_course_world_record.go +++ b/database/update_course_world_record.go @@ -11,12 +11,14 @@ func UpdateCourseWorldRecord(courseID uint64, ownerPID uint32, score int32) { now := datetime.Now() if GetCourseWorldRecord(courseID) == nil { - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.courses SET world_record_first_pid=?, world_record_creation_date=? WHERE data_id=?`, ownerPID, now, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET world_record_first_pid=$1, world_record_creation_date=$2 WHERE data_id=$3`, ownerPID, now, courseID) + if err != nil { log.Fatal(err) } } - if err := cassandraClusterSession.Query(`UPDATE pretendo_smm.courses SET world_record_pid=?, world_record_update_date=?, world_record=? WHERE data_id=?`, ownerPID, now, score, courseID).Exec(); err != nil { + _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET world_record_pid=$1, world_record_update_date=$2, world_record=$3 WHERE data_id=$4`, ownerPID, now, score, courseID) + if err != nil { log.Fatal(err) } } diff --git a/globals/datastore_id_generator.go b/globals/datastore_id_generator.go deleted file mode 100644 index 366fc8c..0000000 --- a/globals/datastore_id_generator.go +++ /dev/null @@ -1,48 +0,0 @@ -package globals - -import ( - "encoding/binary" -) - -// DataStoreIDGenerator represents a safe, structured, ID for unique NEX DataStore objects -type DataStoreIDGenerator struct { - inUse bool - regionID uint8 - nodeID uint8 - Value uint32 -} - -// InUse is used to check if a DataStoreIDGenerator Node is currently generating a number -func (dataStoreIDGenerator *DataStoreIDGenerator) InUse() bool { - return dataStoreIDGenerator.inUse -} - -// SetInUse is used to check if a DataStoreIDGenerator Node is currently generating a number -func (dataStoreIDGenerator *DataStoreIDGenerator) SetInUse(inUse bool) { - dataStoreIDGenerator.inUse = inUse -} - -// Next is used to get the next value from the DataStoreIDGenerator Node -func (dataStoreIDGenerator *DataStoreIDGenerator) Next() uint64 { - if dataStoreIDGenerator.inUse { - panic("Cannot call DataStoreIDGenerator.Next while in use") - } - - dataStoreIDGenerator.Value += 1 - - data := make([]byte, 8) - - data[2] = dataStoreIDGenerator.regionID - data[3] = dataStoreIDGenerator.nodeID - binary.BigEndian.PutUint32(data[4:], dataStoreIDGenerator.Value) - - return binary.BigEndian.Uint64(data) -} - -func NewDataStoreIDGenerator(regionID, nodeID uint8, value uint32) *DataStoreIDGenerator { - return &DataStoreIDGenerator{ - regionID: regionID, - nodeID: nodeID, - Value: value, - } -} diff --git a/globals/globals.go b/globals/globals.go index b416409..5cfff22 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -16,7 +16,6 @@ var AuthenticationServer *nex.Server var SecureServer *nex.Server var MinIOClient *minio.Client var Presigner *S3Presigner -var DataStoreIDGenerators []*DataStoreIDGenerator var GRPCAccountClientConnection *grpc.ClientConn var GRPCAccountClient pb.AccountClient var GRPCAccountCommonMetadata metadata.MD diff --git a/go.mod b/go.mod index a6f62c2..c7bd0e8 100644 --- a/go.mod +++ b/go.mod @@ -8,25 +8,23 @@ require ( github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 github.com/PretendoNetwork/nex-protocols-go v1.0.55 github.com/PretendoNetwork/plogger-go v1.0.4 - github.com/gocql/gocql v1.6.0 github.com/joho/godotenv v1.5.1 + github.com/lib/pq v1.10.9 github.com/minio/minio-go/v7 v7.0.63 - google.golang.org/grpc v1.58.3 + google.golang.org/grpc v1.59.0 ) require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/google/uuid v1.3.1 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jwalton/go-supportscolor v1.2.0 // indirect - github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/compress v1.17.1 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -37,12 +35,11 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/go.sum b/go.sum index 3b4f4df..79bee92 100644 --- a/go.sum +++ b/go.sum @@ -8,10 +8,6 @@ github.com/PretendoNetwork/nex-protocols-go v1.0.55 h1:8QMeCNO2eZO4m7CRT/nv2WWm+ github.com/PretendoNetwork/nex-protocols-go v1.0.55/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= github.com/PretendoNetwork/plogger-go v1.0.4/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -19,42 +15,32 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= +github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.63 h1:GbZ2oCvaUdgT5640WJOpyDhhDxvknAJU2/T3yurwcbQ= @@ -84,8 +70,8 @@ golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -100,17 +86,15 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= diff --git a/init.go b/init.go index 80829c8..07cd1aa 100644 --- a/init.go +++ b/init.go @@ -4,7 +4,6 @@ import ( "fmt" "log" "os" - "runtime" "strconv" "strings" @@ -28,10 +27,10 @@ func init() { } s3Endpoint := os.Getenv("PN_SMM_CONFIG_S3_ENDPOINT") - //s3Region := os.Getenv("PN_SMM_CONFIG_S3_REGION") s3AccessKey := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_KEY") s3AccessSecret := os.Getenv("PN_SMM_CONFIG_S3_ACCESS_SECRET") + postgresURI := os.Getenv("PN_SMM_POSTGRES_URI") kerberosPassword := os.Getenv("PN_SMM_KERBEROS_PASSWORD") authenticationServerPort := os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT") secureServerHost := os.Getenv("PN_SMM_SECURE_SERVER_HOST") @@ -40,6 +39,11 @@ func init() { accountGRPCPort := os.Getenv("PN_SMM_ACCOUNT_GRPC_PORT") accountGRPCAPIKey := os.Getenv("PN_SMM_ACCOUNT_GRPC_API_KEY") + if strings.TrimSpace(postgresURI) == "" { + globals.Logger.Error("PN_SMM_POSTGRES_URI environment variable not set") + os.Exit(0) + } + if strings.TrimSpace(kerberosPassword) == "" { globals.Logger.Warningf("PN_SMM_KERBEROS_PASSWORD environment variable not set. Using default password: %q", globals.KerberosPassword) } else { @@ -123,21 +127,6 @@ func init() { globals.MinIOClient = minIOClient globals.Presigner = globals.NewS3Presigner(globals.MinIOClient) - // Connect to and setup databases - database.ConnectAll() - createDataStoreIDGenerators() -} - -func createDataStoreIDGenerators() { - globals.DataStoreIDGenerators = make([]*globals.DataStoreIDGenerator, 0) - regionID := 0 // USA - - for corenum := 0; corenum < runtime.NumCPU(); corenum++ { - database.CreateDataStoreIDGeneratorRow(corenum) - - lastID := database.GetDataStoreIDGeneratorLastID(corenum) - - generator := globals.NewDataStoreIDGenerator(uint8(regionID), uint8(corenum), lastID) - globals.DataStoreIDGenerators = append(globals.DataStoreIDGenerators, generator) - } + // * Connect to and setup databases + database.ConnectPostgres() } diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go index d8110a8..0285a6d 100644 --- a/nex/datastore/prepare_post_object.go +++ b/nex/datastore/prepare_post_object.go @@ -2,7 +2,6 @@ package nex_datastore import ( "fmt" - "math/rand" "os" "time" @@ -14,14 +13,7 @@ import ( ) func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePreparePostParam) uint32 { - rand.Seed(time.Now().UnixNano()) - nodeID := rand.Intn(len(globals.DataStoreIDGenerators)) - - dataStoreIDGenerator := globals.DataStoreIDGenerators[nodeID] - - dataID := dataStoreIDGenerator.Next() - database.SetDataStoreIDGeneratorLastID(nodeID, dataStoreIDGenerator.Value) - database.InitializeCourseData(dataID, client.PID(), param.Size, param.Name, param.Flag, param.ExtraData, param.DataType, param.Period) + dataID := database.InitializeCourseData(client.PID(), param.Size, param.Name, param.Flag, param.ExtraData, param.DataType, param.Period) if param.DataType != 1 { // 1 is Mii data, assume other values are course meta data database.UpdateCourseMetaBinary(dataID, param.MetaBinary) diff --git a/nex/datastore/super-mario-maker/get_course_record.go b/nex/datastore/super-mario-maker/get_course_record.go index 86d3f93..ea1f88f 100644 --- a/nex/datastore/super-mario-maker/get_course_record.go +++ b/nex/datastore/super-mario-maker/get_course_record.go @@ -14,7 +14,7 @@ func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datast rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) if worldRecord == nil { - rmcResponse.SetError(0x690004) + rmcResponse.SetError(nex.Errors.DataStore.NotFound) } else { result := datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult() result.DataID = param.DataID From 36db27a5e79323562227bca20932a5d3a22387e1 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Thu, 26 Oct 2023 21:20:40 -0400 Subject: [PATCH 22/28] remove all the jank, treat everything as originally intended --- .gitignore | 4 +- .../datastore/get_object_info_by_data_id.go | 91 ++++++ ...et_object_info_by_data_id_with_password.go | 90 ++++++ ...nfo_by_persistence_target_with_password.go | 101 +++++++ ...get_object_ratings_with_slot_by_data_id.go | 56 ++++ ...ings_with_slot_by_data_id_with_password.go | 56 ++++ .../datastore/get_object_size_by_data_id.go | 26 ++ ...initialize_object_by_prepare_post_param.go | 81 +++++ .../initialize_object_rating_with_slot.go | 56 ++++ database/datastore/is_object_available.go | 30 ++ .../is_object_available_with_password.go | 42 +++ .../datastore/rate_object_with_password.go | 46 +++ .../get_buffer_queues_by_data_id_and_slot.go | 47 +++ .../get_course_record_by_data_id_and_slot.go | 60 ++++ .../get_custom_rankings_by_data_ids.go | 64 ++++ .../get_random_courses_with_limit.go | 116 ++++++++ .../get_user_course_object_ids.go | 55 ++++ ...initialize_object_by_prepare_post_param.go | 81 +++++ .../insert_or_update_buffer_queue_data.go | 42 +++ .../insert_or_update_course_record.go | 57 ++++ .../insert_or_update_custom_ranking.go | 38 +++ ...ject_data_type_by_data_id_with_password.go | 47 +++ ...ct_meta_binary_by_data_id_with_password.go | 47 +++ ..._object_period_by_data_id_with_password.go | 47 +++ ...date_object_upload_completed_by_data_id.go | 38 +++ database/get_buffer_queue_death_data.go | 31 -- database/get_course_metadata_by_data_id.go | 56 ---- database/get_course_metadata_by_data_ids.go | 18 -- database/get_course_metadatas_by_limit.go | 76 ----- database/get_course_metadatas_by_pid.go | 32 -- database/get_course_world_record.go | 28 -- database/get_user_mii_info_by_pid.go | 21 -- database/get_user_starred_courses.go | 20 -- database/increment_course_attempt_count.go | 10 - database/increment_course_clear_count.go | 10 - database/increment_course_fail_count.go | 10 - database/increment_course_star_count.go | 10 - database/init_postgres.go | 281 ++++++++++++++---- database/initialize_course_data.go | 73 ----- database/insert_buffer_queue_data.go | 10 - database/set_course_playable.go | 10 - database/update_course_meta_binary.go | 10 - database/update_course_world_record.go | 24 -- globals/s3_helpers.go | 20 ++ globals/verify_object_permission.go | 40 +++ go.mod | 10 +- go.sum | 13 +- nex/datastore/change_meta.go | 43 ++- nex/datastore/complete_post_object.go | 38 ++- nex/datastore/get_meta.go | 160 +++++----- nex/datastore/get_metas_multiple_param.go | 116 +++++++- nex/datastore/prepare_get_object.go | 26 +- nex/datastore/prepare_post_object.go | 22 +- nex/datastore/rate_objects.go | 35 ++- .../super-mario-maker/add_to_buffer_queues.go | 49 ++- .../check_rate_custom_ranking_counter.go | 19 +- .../super-mario-maker/complete_attach_file.go | 41 ++- .../ctr_pick_up_course_search_object.go | 33 +- .../followings_latest_course_search_object.go | 56 +++- .../get_application_config.go | 64 ++-- .../get_application_config_string.go | 16 +- .../super-mario-maker/get_buffer_queue.go | 27 +- .../super-mario-maker/get_course_record.go | 39 ++- .../get_custom_ranking_by_data_id.go | 99 +++--- .../super-mario-maker/get_deletion_reason.go | 21 +- .../get_metas_with_course_record.go | 128 +++++++- .../super-mario-maker/get_object_infos.go | 22 +- .../super-mario-maker/prepare_attach_file.go | 39 ++- .../super-mario-maker/rate_custom_ranking.go | 87 +----- .../recommended_course_search_object.go | 43 ++- .../suggested_course_search_object.go | 35 ++- .../super-mario-maker/upload_course_record.go | 12 +- nex/message-delivery/deliver_message.go | 7 + types/course_metadata.go | 20 -- types/course_world_record.go | 11 - utility/utility.go | 195 ------------ 76 files changed, 2567 insertions(+), 1167 deletions(-) create mode 100644 database/datastore/get_object_info_by_data_id.go create mode 100644 database/datastore/get_object_info_by_data_id_with_password.go create mode 100644 database/datastore/get_object_info_by_persistence_target_with_password.go create mode 100644 database/datastore/get_object_ratings_with_slot_by_data_id.go create mode 100644 database/datastore/get_object_ratings_with_slot_by_data_id_with_password.go create mode 100644 database/datastore/get_object_size_by_data_id.go create mode 100644 database/datastore/initialize_object_by_prepare_post_param.go create mode 100644 database/datastore/initialize_object_rating_with_slot.go create mode 100644 database/datastore/is_object_available.go create mode 100644 database/datastore/is_object_available_with_password.go create mode 100644 database/datastore/rate_object_with_password.go create mode 100644 database/datastore/super-mario-maker/get_buffer_queues_by_data_id_and_slot.go create mode 100644 database/datastore/super-mario-maker/get_course_record_by_data_id_and_slot.go create mode 100644 database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go create mode 100644 database/datastore/super-mario-maker/get_random_courses_with_limit.go create mode 100644 database/datastore/super-mario-maker/get_user_course_object_ids.go create mode 100644 database/datastore/super-mario-maker/initialize_object_by_prepare_post_param.go create mode 100644 database/datastore/super-mario-maker/insert_or_update_buffer_queue_data.go create mode 100644 database/datastore/super-mario-maker/insert_or_update_course_record.go create mode 100644 database/datastore/super-mario-maker/insert_or_update_custom_ranking.go create mode 100644 database/datastore/update_object_data_type_by_data_id_with_password.go create mode 100644 database/datastore/update_object_meta_binary_by_data_id_with_password.go create mode 100644 database/datastore/update_object_period_by_data_id_with_password.go create mode 100644 database/datastore/update_object_upload_completed_by_data_id.go delete mode 100644 database/get_buffer_queue_death_data.go delete mode 100644 database/get_course_metadata_by_data_id.go delete mode 100644 database/get_course_metadata_by_data_ids.go delete mode 100644 database/get_course_metadatas_by_limit.go delete mode 100644 database/get_course_metadatas_by_pid.go delete mode 100644 database/get_course_world_record.go delete mode 100644 database/get_user_mii_info_by_pid.go delete mode 100644 database/get_user_starred_courses.go delete mode 100644 database/increment_course_attempt_count.go delete mode 100644 database/increment_course_clear_count.go delete mode 100644 database/increment_course_fail_count.go delete mode 100644 database/increment_course_star_count.go delete mode 100644 database/initialize_course_data.go delete mode 100644 database/insert_buffer_queue_data.go delete mode 100644 database/set_course_playable.go delete mode 100644 database/update_course_meta_binary.go delete mode 100644 database/update_course_world_record.go create mode 100644 globals/s3_helpers.go create mode 100644 globals/verify_object_permission.go delete mode 100644 types/course_metadata.go delete mode 100644 types/course_world_record.go delete mode 100644 utility/utility.go diff --git a/.gitignore b/.gitignore index 917ee82..98ae7e5 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,4 @@ go.work.sum .vscode .env build -log -*.pem -*.key \ No newline at end of file +log \ No newline at end of file diff --git a/database/datastore/get_object_info_by_data_id.go b/database/datastore/get_object_info_by_data_id.go new file mode 100644 index 0000000..9b8c9b9 --- /dev/null +++ b/database/datastore/get_object_info_by_data_id.go @@ -0,0 +1,91 @@ +package datastore_db + +import ( + "database/sql" + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func GetObjectInfoByDataID(dataID uint64) (*datastore_types.DataStoreMetaInfo, uint32) { + errCode := IsObjectAvailable(dataID) + if errCode != 0 { + return nil, errCode + } + + metaInfo := datastore_types.NewDataStoreMetaInfo() + metaInfo.Permission = datastore_types.NewDataStorePermission() + metaInfo.DelPermission = datastore_types.NewDataStorePermission() + metaInfo.CreatedTime = nex.NewDateTime(0) + metaInfo.UpdatedTime = nex.NewDateTime(0) + metaInfo.ReferredTime = nex.NewDateTime(0) + metaInfo.ExpireTime = nex.NewDateTime(0x9C3f3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends + metaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + + var createdDate time.Time + var updatedDate time.Time + + err := database.Postgres.QueryRow(`SELECT + data_id, + owner, + size, + name, + data_type, + meta_binary, + permission, + permission_recipients, + delete_permission, + delete_permission_recipients, + period, + refer_data_id, + flag, + tags, + creation_date, + update_date + FROM datastore.objects WHERE data_id=$1`, dataID).Scan( + &metaInfo.DataID, + &metaInfo.OwnerID, + &metaInfo.Size, + &metaInfo.Name, + &metaInfo.DataType, + &metaInfo.MetaBinary, + &metaInfo.Permission.Permission, + pq.Array(&metaInfo.Permission.RecipientIDs), + &metaInfo.DelPermission.Permission, + pq.Array(&metaInfo.DelPermission.RecipientIDs), + &metaInfo.Period, + &metaInfo.ReferDataID, + &metaInfo.Flag, + pq.Array(&metaInfo.Tags), + &createdDate, + &updatedDate, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + ratings, errCode := GetObjectRatingsWithSlotByDataID(metaInfo.DataID) + if errCode != 0 { + return nil, errCode + } + + metaInfo.Ratings = ratings + + metaInfo.CreatedTime.FromTimestamp(createdDate) + metaInfo.UpdatedTime.FromTimestamp(updatedDate) + metaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does + + return metaInfo, 0 +} diff --git a/database/datastore/get_object_info_by_data_id_with_password.go b/database/datastore/get_object_info_by_data_id_with_password.go new file mode 100644 index 0000000..9e5da81 --- /dev/null +++ b/database/datastore/get_object_info_by_data_id_with_password.go @@ -0,0 +1,90 @@ +package datastore_db + +import ( + "database/sql" + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func GetObjectInfoByDataIDWithPassword(dataID uint64, password uint64) (*datastore_types.DataStoreMetaInfo, uint32) { + errCode := IsObjectAvailableWithPassword(dataID, password) + if errCode != 0 { + return nil, errCode + } + + metaInfo := datastore_types.NewDataStoreMetaInfo() + metaInfo.Permission = datastore_types.NewDataStorePermission() + metaInfo.DelPermission = datastore_types.NewDataStorePermission() + metaInfo.CreatedTime = nex.NewDateTime(0) + metaInfo.UpdatedTime = nex.NewDateTime(0) + metaInfo.ReferredTime = nex.NewDateTime(0) + metaInfo.ExpireTime = nex.NewDateTime(0x9C3f3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends + metaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + + var createdDate time.Time + var updatedDate time.Time + + err := database.Postgres.QueryRow(`SELECT + data_id, + owner, + size, + name, + data_type, + meta_binary, + permission, + permission_recipients, + delete_permission, + delete_permission_recipients, + period, + refer_data_id, + flag, + tags, + creation_date, + update_date + FROM datastore.objects WHERE data_id=$1`, dataID).Scan( + &metaInfo.DataID, + &metaInfo.OwnerID, + &metaInfo.Size, + &metaInfo.Name, + &metaInfo.DataType, + &metaInfo.MetaBinary, + &metaInfo.Permission.Permission, + pq.Array(&metaInfo.Permission.RecipientIDs), + &metaInfo.DelPermission.Permission, + pq.Array(&metaInfo.DelPermission.RecipientIDs), + &metaInfo.Period, + &metaInfo.ReferDataID, + &metaInfo.Flag, + pq.Array(&metaInfo.Tags), + &createdDate, + &updatedDate, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + ratings, errCode := GetObjectRatingsWithSlotByDataIDWithPassword(metaInfo.DataID, password) + if errCode != 0 { + return nil, errCode + } + + metaInfo.Ratings = ratings + + metaInfo.CreatedTime.FromTimestamp(createdDate) + metaInfo.UpdatedTime.FromTimestamp(updatedDate) + metaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does + + return metaInfo, 0 +} diff --git a/database/datastore/get_object_info_by_persistence_target_with_password.go b/database/datastore/get_object_info_by_persistence_target_with_password.go new file mode 100644 index 0000000..a1470f0 --- /dev/null +++ b/database/datastore/get_object_info_by_persistence_target_with_password.go @@ -0,0 +1,101 @@ +package datastore_db + +import ( + "database/sql" + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func GetObjectInfoByPersistenceTargetWithPassword(persistenceTarget *datastore_types.DataStorePersistenceTarget, password uint64) (*datastore_types.DataStoreMetaInfo, uint32) { + metaInfo := datastore_types.NewDataStoreMetaInfo() + metaInfo.Permission = datastore_types.NewDataStorePermission() + metaInfo.DelPermission = datastore_types.NewDataStorePermission() + metaInfo.CreatedTime = nex.NewDateTime(0) + metaInfo.UpdatedTime = nex.NewDateTime(0) + metaInfo.ReferredTime = nex.NewDateTime(0) + metaInfo.ExpireTime = nex.NewDateTime(0x9C3f3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends + metaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + + var accessPassword uint64 + var underReview bool + var createdDate time.Time + var updatedDate time.Time + + err := database.Postgres.QueryRow(`SELECT + data_id, + owner, + size, + name, + data_type, + meta_binary, + permission, + permission_recipients, + delete_permission, + delete_permission_recipients, + period, + refer_data_id, + flag, + tags, + creation_date, + update_date, + access_password, + under_review + FROM datastore.objects WHERE owner=$1 AND persistence_slot_id=$2 AND upload_completed=TRUE AND deleted=FALSE`, persistenceTarget.OwnerID, persistenceTarget.PersistenceSlotID).Scan( + &metaInfo.DataID, + &metaInfo.OwnerID, + &metaInfo.Size, + &metaInfo.Name, + &metaInfo.DataType, + &metaInfo.MetaBinary, + &metaInfo.Permission.Permission, + pq.Array(&metaInfo.Permission.RecipientIDs), + &metaInfo.DelPermission.Permission, + pq.Array(&metaInfo.DelPermission.RecipientIDs), + &metaInfo.Period, + &metaInfo.ReferDataID, + &metaInfo.Flag, + pq.Array(&metaInfo.Tags), + &createdDate, + &updatedDate, + &accessPassword, + &underReview, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + if accessPassword != 0 && accessPassword != password { + return nil, nex.Errors.DataStore.InvalidPassword + } + + if underReview { + return nil, nex.Errors.DataStore.UnderReviewing + } + + ratings, errCode := GetObjectRatingsWithSlotByDataIDWithPassword(metaInfo.DataID, password) + if errCode != 0 { + globals.Logger.Errorf("Failed to get ratings for object %d with password %d", metaInfo.DataID, password) + return nil, errCode + } + + metaInfo.Ratings = ratings + + metaInfo.CreatedTime.FromTimestamp(createdDate) + metaInfo.UpdatedTime.FromTimestamp(updatedDate) + metaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does + + return metaInfo, 0 +} diff --git a/database/datastore/get_object_ratings_with_slot_by_data_id.go b/database/datastore/get_object_ratings_with_slot_by_data_id.go new file mode 100644 index 0000000..971a8c3 --- /dev/null +++ b/database/datastore/get_object_ratings_with_slot_by_data_id.go @@ -0,0 +1,56 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func GetObjectRatingsWithSlotByDataID(dataID uint64) ([]*datastore_types.DataStoreRatingInfoWithSlot, uint32) { + errCode := IsObjectAvailable(dataID) + if errCode != 0 { + return nil, errCode + } + + ratings := make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + + rows, err := database.Postgres.Query(`SELECT slot, total_value, count, initial_value FROM datastore.object_ratings WHERE data_id=$1`, dataID) + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + defer rows.Close() + + for rows.Next() { + rating := datastore_types.NewDataStoreRatingInfoWithSlot() + rating.Rating = datastore_types.NewDataStoreRatingInfo() + + err := rows.Scan(&rating.Slot, &rating.Rating.TotalValue, &rating.Rating.Count, &rating.Rating.InitialValue) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + ratings = append(ratings, rating) + } + + if err := rows.Err(); err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + return ratings, 0 +} diff --git a/database/datastore/get_object_ratings_with_slot_by_data_id_with_password.go b/database/datastore/get_object_ratings_with_slot_by_data_id_with_password.go new file mode 100644 index 0000000..ce42f84 --- /dev/null +++ b/database/datastore/get_object_ratings_with_slot_by_data_id_with_password.go @@ -0,0 +1,56 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func GetObjectRatingsWithSlotByDataIDWithPassword(dataID uint64, password uint64) ([]*datastore_types.DataStoreRatingInfoWithSlot, uint32) { + errCode := IsObjectAvailableWithPassword(dataID, password) + if errCode != 0 { + return nil, errCode + } + + ratings := make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + + rows, err := database.Postgres.Query(`SELECT slot, total_value, count, initial_value FROM datastore.object_ratings WHERE data_id=$1`, dataID) + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + defer rows.Close() + + for rows.Next() { + rating := datastore_types.NewDataStoreRatingInfoWithSlot() + rating.Rating = datastore_types.NewDataStoreRatingInfo() + + err := rows.Scan(&rating.Slot, &rating.Rating.TotalValue, &rating.Rating.Count, &rating.Rating.InitialValue) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + ratings = append(ratings, rating) + } + + if err := rows.Err(); err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + return ratings, 0 +} diff --git a/database/datastore/get_object_size_by_data_id.go b/database/datastore/get_object_size_by_data_id.go new file mode 100644 index 0000000..682ad60 --- /dev/null +++ b/database/datastore/get_object_size_by_data_id.go @@ -0,0 +1,26 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func GetObjectSizeDataID(dataID uint64) (uint32, uint32) { + var size uint32 + + err := database.Postgres.QueryRow(`SELECT size FROM datastore.objects WHERE data_id=$1`, dataID).Scan(&size) + if err != nil { + if err == sql.ErrNoRows { + return 0, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return 0, nex.Errors.DataStore.Unknown + } + + return size, 0 +} diff --git a/database/datastore/initialize_object_by_prepare_post_param.go b/database/datastore/initialize_object_by_prepare_post_param.go new file mode 100644 index 0000000..b41946c --- /dev/null +++ b/database/datastore/initialize_object_by_prepare_post_param.go @@ -0,0 +1,81 @@ +package datastore_db + +import ( + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func InitializeObjectByPreparePostParam(ownerPID uint32, param *datastore_types.DataStorePreparePostParam) (uint64, uint32) { + now := time.Now() + + var dataID uint64 + + err := database.Postgres.QueryRow(`INSERT INTO datastore.objects ( + owner, + size, + name, + data_type, + meta_binary, + permission, + permission_recipients, + delete_permission, + delete_permission_recipients, + flag, + period, + refer_data_id, + tags, + persistence_slot_id, + extra_data, + creation_date, + update_date + ) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15, + $16, + $17 + ) RETURNING data_id`, + ownerPID, + param.Size, + param.Name, + param.DataType, + param.MetaBinary, + param.Permission.Permission, + pq.Array(param.Permission.RecipientIDs), + param.DelPermission.Permission, + pq.Array(param.DelPermission.RecipientIDs), + param.Flag, + param.Period, + param.ReferDataID, + pq.Array(param.Tags), + param.PersistenceInitParam.PersistenceSlotID, // TODO - Check param.PersistenceInitParam.DeleteLastObject? + pq.Array(param.ExtraData), + now, + now, + ).Scan(&dataID) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return 0, nex.Errors.DataStore.Unknown + } + + return dataID, 0 +} diff --git a/database/datastore/initialize_object_rating_with_slot.go b/database/datastore/initialize_object_rating_with_slot.go new file mode 100644 index 0000000..fc17005 --- /dev/null +++ b/database/datastore/initialize_object_rating_with_slot.go @@ -0,0 +1,56 @@ +package datastore_db + +import ( + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func InitializeObjectRatingWithSlot(dataID uint64, param *datastore_types.DataStoreRatingInitParamWithSlot) uint32 { + _, err := database.Postgres.Exec(`INSERT INTO datastore.object_ratings ( + data_id, + slot, + flag, + internal_flag, + lock_type, + initial_value, + range_min, + range_max, + period_hour, + period_duration, + total_value + ) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11 + )`, + dataID, + param.Slot, + param.Param.Flag, + param.Param.InternalFlag, + param.Param.LockType, + param.Param.InitialValue, + param.Param.RangeMin, + param.Param.RangeMax, + param.Param.PeriodHour, + param.Param.PeriodDuration, + param.Param.InitialValue, // * Start the value off at the initial value + ) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/is_object_available.go b/database/datastore/is_object_available.go new file mode 100644 index 0000000..0a9f28d --- /dev/null +++ b/database/datastore/is_object_available.go @@ -0,0 +1,30 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func IsObjectAvailable(dataID uint64) uint32 { + var underReview bool + + err := database.Postgres.QueryRow(`SELECT under_review FROM datastore.objects WHERE data_id=$1 AND upload_completed=TRUE AND deleted=FALSE`, dataID).Scan(&underReview) + if err != nil { + if err == sql.ErrNoRows { + return nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + if underReview { + return nex.Errors.DataStore.UnderReviewing + } + + return 0 +} diff --git a/database/datastore/is_object_available_with_password.go b/database/datastore/is_object_available_with_password.go new file mode 100644 index 0000000..2367d5e --- /dev/null +++ b/database/datastore/is_object_available_with_password.go @@ -0,0 +1,42 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func IsObjectAvailableWithPassword(dataID, password uint64) uint32 { + var underReview bool + var accessPassword uint64 + + err := database.Postgres.QueryRow(`SELECT + under_review, + access_password + FROM datastore.objects WHERE data_id=$1 AND upload_completed=TRUE AND deleted=FALSE`, dataID).Scan( + &underReview, + &accessPassword, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + if accessPassword != 0 && accessPassword != password { + return nex.Errors.DataStore.InvalidPassword + } + + if underReview { + return nex.Errors.DataStore.UnderReviewing + } + + return 0 +} diff --git a/database/datastore/rate_object_with_password.go b/database/datastore/rate_object_with_password.go new file mode 100644 index 0000000..fd5253b --- /dev/null +++ b/database/datastore/rate_object_with_password.go @@ -0,0 +1,46 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func RateObjectWithPassword(dataID uint64, slot uint8, ratingValue int32, accessPassword uint64) (*datastore_types.DataStoreRatingInfo, uint32) { + errCode := IsObjectAvailableWithPassword(dataID, accessPassword) + if errCode != 0 { + return nil, errCode + } + + rating := datastore_types.NewDataStoreRatingInfo() + + err := database.Postgres.QueryRow(` + UPDATE datastore.object_ratings + SET total_value=total_value+$1, count=count+1 + WHERE data_id=$2 AND slot=$3 + RETURNING total_value, count, initial_value`, ratingValue, dataID, slot, + ).Scan( + &rating.TotalValue, + &rating.Count, + &rating.InitialValue, + ) + + if err != nil { + // * If no data was returned, that means the slot + // * was out of bounds since the object exists due + // * to the check at the start of the function. + // * This is an invalid argument + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.InvalidArgument + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + return rating, 0 +} diff --git a/database/datastore/super-mario-maker/get_buffer_queues_by_data_id_and_slot.go b/database/datastore/super-mario-maker/get_buffer_queues_by_data_id_and_slot.go new file mode 100644 index 0000000..194138c --- /dev/null +++ b/database/datastore/super-mario-maker/get_buffer_queues_by_data_id_and_slot.go @@ -0,0 +1,47 @@ +package datastore_smm_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" +) + +func GetBufferQueuesByDataIDAndSlot(dataID uint64, slot uint32) ([][]byte, uint32) { + errCode := datastore_db.IsObjectAvailable(dataID) + if errCode != 0 { + return nil, errCode + } + + bufferQueues := make([][]byte, 0) + + rows, err := database.Postgres.Query(`SELECT buffer FROM datastore.buffer_queues WHERE data_id=$1 AND slot=$2 ORDER BY creation_date`, dataID, slot) + + // * No rows is allowed + if err != nil && err != sql.ErrNoRows { + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + defer rows.Close() + + for rows.Next() { + var buffer []byte + + err := rows.Scan(&buffer) + if err != nil { + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + bufferQueues = append(bufferQueues, buffer) + } + + if err := rows.Err(); err != nil { + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + return bufferQueues, 0 +} diff --git a/database/datastore/super-mario-maker/get_course_record_by_data_id_and_slot.go b/database/datastore/super-mario-maker/get_course_record_by_data_id_and_slot.go new file mode 100644 index 0000000..5696d3b --- /dev/null +++ b/database/datastore/super-mario-maker/get_course_record_by_data_id_and_slot.go @@ -0,0 +1,60 @@ +package datastore_smm_db + +import ( + "database/sql" + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func GetCourseRecordByDataIDAndSlot(dataID uint64, slot uint8) (*datastore_super_mario_maker_types.DataStoreGetCourseRecordResult, uint32) { + errCode := datastore_db.IsObjectAvailable(dataID) + if errCode != 0 { + return nil, errCode + } + + courseRecord := datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult() + courseRecord.DataID = dataID + courseRecord.Slot = slot + courseRecord.CreatedTime = nex.NewDateTime(0) + courseRecord.UpdatedTime = nex.NewDateTime(0) + + var createdDate time.Time + var updatedDate time.Time + + err := database.Postgres.QueryRow(`SELECT + first_pid, + best_pid, + best_score, + creation_date, + update_date + FROM datastore.course_records WHERE data_id=$1 AND slot=$2`, + dataID, + slot, + ).Scan( + &courseRecord.FirstPID, + &courseRecord.BestPID, + &courseRecord.BestScore, + &createdDate, + &updatedDate, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + courseRecord.CreatedTime.FromTimestamp(createdDate) + courseRecord.UpdatedTime.FromTimestamp(updatedDate) + + return courseRecord, 0 +} diff --git a/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go b/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go new file mode 100644 index 0000000..9d585c9 --- /dev/null +++ b/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go @@ -0,0 +1,64 @@ +package datastore_smm_db + +import ( + "database/sql" + + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datastore_super_mario_maker_types.DataStoreCustomRankingResult { + // * Unlike other methods which query for multiple objects, + // * DataStoreSMM::GetCustomRankingByDataID *OMITS* objects + // * from it's response if they could not be found, rather + // * than using a zero-ed object and DataStore::NotFound as + // * the Result. Because of this, all errors are just thrown + // * away here and not sent back to the client + results := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0, len(dataIDs)) + + rows, err := database.Postgres.Query(`SELECT + data_id, + value + FROM datastore.object_custom_rankings WHERE application_id=$1 AND data_id=ANY($2)`, + applicationID, + pq.Array(dataIDs), + ) + + // * No rows is allowed + if err != nil && err != sql.ErrNoRows { + globals.Logger.Error(err.Error()) + return results + } + + defer rows.Close() + + for rows.Next() { + var dataID uint64 + var value uint32 + + err := rows.Scan(&dataID, &value) + if err != nil { + globals.Logger.Error(err.Error()) + continue + } + + objectInfo, errCode := datastore_db.GetObjectInfoByDataID(dataID) + if errCode != 0 { + globals.Logger.Errorf("Got error code %d for object %d", errCode, dataID) + continue + } + + result := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() + + // * Order is always 0, for some reason + result.Score = value + result.MetaInfo = objectInfo + + results = append(results, result) + } + + return results +} diff --git a/database/datastore/super-mario-maker/get_random_courses_with_limit.go b/database/datastore/super-mario-maker/get_random_courses_with_limit.go new file mode 100644 index 0000000..6caa1f2 --- /dev/null +++ b/database/datastore/super-mario-maker/get_random_courses_with_limit.go @@ -0,0 +1,116 @@ +package datastore_smm_db + +import ( + "database/sql" + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func GetRandomCoursesWithLimit(limit int) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, uint32) { + courses := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) + + rows, err := database.Postgres.Query(` + SELECT + object.data_id, + object.owner, + object.size, + object.name, + object.data_type, + object.meta_binary, + object.permission, + object.permission_recipients, + object.delete_permission, + object.delete_permission_recipients, + object.period, + object.refer_data_id, + object.flag, + object.tags, + object.creation_date, + object.update_date, + ranking.value + FROM datastore.objects object + JOIN datastore.object_custom_rankings ranking + ON + object.data_id = ranking.data_id AND + object.upload_completed = TRUE AND + object.deleted = FALSE AND + object.under_review = FALSE AND + ranking.application_id = 0 + ORDER BY RANDOM() + LIMIT $1 + `, limit) + + if err != nil { + if err == sql.ErrNoRows { + return nil, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + defer rows.Close() + + for rows.Next() { + course := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() + course.Order = 0 // * Order is ALWAYS 0 + course.MetaInfo = datastore_types.NewDataStoreMetaInfo() + course.MetaInfo.Permission = datastore_types.NewDataStorePermission() + course.MetaInfo.DelPermission = datastore_types.NewDataStorePermission() + course.MetaInfo.CreatedTime = nex.NewDateTime(0) + course.MetaInfo.UpdatedTime = nex.NewDateTime(0) + course.MetaInfo.ReferredTime = nex.NewDateTime(0) + course.MetaInfo.ExpireTime = nex.NewDateTime(0x9C3f3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends + course.MetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + + var createdDate time.Time + var updatedDate time.Time + + err := rows.Scan( + &course.MetaInfo.DataID, + &course.MetaInfo.OwnerID, + &course.MetaInfo.Size, + &course.MetaInfo.Name, + &course.MetaInfo.DataType, + &course.MetaInfo.MetaBinary, + &course.MetaInfo.Permission.Permission, + pq.Array(&course.MetaInfo.Permission.RecipientIDs), + &course.MetaInfo.DelPermission.Permission, + pq.Array(&course.MetaInfo.DelPermission.RecipientIDs), + &course.MetaInfo.Period, + &course.MetaInfo.ReferDataID, + &course.MetaInfo.Flag, + pq.Array(&course.MetaInfo.Tags), + &createdDate, + &updatedDate, + &course.Score, + ) + if err != nil { + globals.Logger.Error(err.Error()) + continue + } + + ratings, errCode := datastore_db.GetObjectRatingsWithSlotByDataID(course.MetaInfo.DataID) + if errCode != 0 { + return nil, errCode + } + + course.MetaInfo.Ratings = ratings + + course.MetaInfo.CreatedTime.FromTimestamp(createdDate) + course.MetaInfo.UpdatedTime.FromTimestamp(updatedDate) + course.MetaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does + + courses = append(courses, course) + } + + return courses, 0 +} diff --git a/database/datastore/super-mario-maker/get_user_course_object_ids.go b/database/datastore/super-mario-maker/get_user_course_object_ids.go new file mode 100644 index 0000000..cb6eda0 --- /dev/null +++ b/database/datastore/super-mario-maker/get_user_course_object_ids.go @@ -0,0 +1,55 @@ +package datastore_smm_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func GetUserCourseObjectIDs(ownerPID uint32) ([]uint64, uint32) { + courseObjectIDs := make([]uint64, 0) + + // * Course objects seem to have data types > 2 and < 50. + // * Data type 1 seems to be reserved for "maker" objects. + // * Data type 2 seems to be reserved for objects + // * created through "PrepareAttachFile". + // * Data type 50 is reserved for the Event Courses metadata + // * file, and data type 51 is reserved for event courses + rows, err := database.Postgres.Query(`SELECT data_id FROM datastore.objects WHERE owner=$1 AND data_type > 2 AND data_type < 50`, ownerPID) + + // * No rows is allowed + if err != nil && err != sql.ErrNoRows { + globals.Logger.Error(err.Error()) + return nil, nex.Errors.DataStore.Unknown + } + + defer rows.Close() + + for rows.Next() { + var dataID uint64 + + err := rows.Scan(&dataID) + if err != nil { + globals.Logger.Error(err.Error()) + continue + } + + errCode := datastore_db.IsObjectAvailable(dataID) + if errCode != 0 { + globals.Logger.Errorf("Got error code %d for object %d", errCode, dataID) + continue + } + + courseObjectIDs = append(courseObjectIDs, dataID) + } + + if err := rows.Err(); err != nil { + // TODO - Send more specific errors? + return nil, nex.Errors.DataStore.Unknown + } + + return courseObjectIDs, 0 +} diff --git a/database/datastore/super-mario-maker/initialize_object_by_prepare_post_param.go b/database/datastore/super-mario-maker/initialize_object_by_prepare_post_param.go new file mode 100644 index 0000000..6ec30a1 --- /dev/null +++ b/database/datastore/super-mario-maker/initialize_object_by_prepare_post_param.go @@ -0,0 +1,81 @@ +package datastore_smm_db + +import ( + "time" + + "github.com/PretendoNetwork/nex-go" + datastore_smm_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" +) + +func InitializeObjectByAttachFileParam(ownerPID uint32, param *datastore_smm_types.DataStoreAttachFileParam) (uint64, uint32) { + now := time.Now() + + var dataID uint64 + + err := database.Postgres.QueryRow(`INSERT INTO datastore.objects ( + owner, + size, + name, + data_type, + meta_binary, + permission, + permission_recipients, + delete_permission, + delete_permission_recipients, + flag, + period, + refer_data_id, + tags, + persistence_slot_id, + extra_data, + creation_date, + update_date + ) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15, + $16, + $17 + ) RETURNING data_id`, + ownerPID, + param.PostParam.Size, + param.PostParam.Name, + param.PostParam.DataType, + param.PostParam.MetaBinary, + param.PostParam.Permission.Permission, + pq.Array(param.PostParam.Permission.RecipientIDs), + param.PostParam.DelPermission.Permission, + pq.Array(param.PostParam.DelPermission.RecipientIDs), + param.PostParam.Flag, + param.PostParam.Period, + param.ReferDataID, + pq.Array(param.PostParam.Tags), + param.PostParam.PersistenceInitParam.PersistenceSlotID, // TODO - Check param.PersistenceInitParam.DeleteLastObject? + pq.Array(param.PostParam.ExtraData), + now, + now, + ).Scan(&dataID) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return 0, nex.Errors.DataStore.Unknown + } + + return dataID, 0 +} diff --git a/database/datastore/super-mario-maker/insert_or_update_buffer_queue_data.go b/database/datastore/super-mario-maker/insert_or_update_buffer_queue_data.go new file mode 100644 index 0000000..4271679 --- /dev/null +++ b/database/datastore/super-mario-maker/insert_or_update_buffer_queue_data.go @@ -0,0 +1,42 @@ +package datastore_smm_db + +import ( + "log" + "time" + + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" +) + +func InsertOrUpdateBufferQueueData(dataID uint64, slot uint32, buffer []byte) uint32 { + errCode := datastore_db.IsObjectAvailable(dataID) + if errCode != 0 { + return errCode + } + + now := time.Now() + + // * Real server does not allow duplicate + // * buffers to be in a given objects slot, + // * even if the buffers were uploaded by + // * different clients. Instead, it removes + // * the older buffer and adds the newer one. + // * Instead of that, we just update the + // * creation time + _, err := database.Postgres.Exec(`INSERT INTO datastore.buffer_queues ( + data_id, + slot, + creation_date, + buffer + ) VALUES ( + $1, + $2, + $3, + $4 + ) ON CONFLICT (data_id, slot, buffer) DO UPDATE SET creation_date=$3`, dataID, slot, now, buffer) + if err != nil { + log.Fatal(err) + } + + return 0 +} diff --git a/database/datastore/super-mario-maker/insert_or_update_course_record.go b/database/datastore/super-mario-maker/insert_or_update_course_record.go new file mode 100644 index 0000000..77f6931 --- /dev/null +++ b/database/datastore/super-mario-maker/insert_or_update_course_record.go @@ -0,0 +1,57 @@ +package datastore_smm_db + +import ( + "time" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func InsertOrUpdateCourseRecord(dataID uint64, slot uint8, pid uint32, score int32) uint32 { + errCode := datastore_db.IsObjectAvailable(dataID) + if errCode != 0 { + globals.Logger.Errorf("Error code %d", errCode) + return errCode + } + + now := time.Now() + + _, err := database.Postgres.Exec(`INSERT INTO datastore.course_records ( + data_id, + slot, + first_pid, + best_pid, + best_score, + creation_date, + update_date + ) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6, + $7 + ) ON CONFLICT (data_id, slot) DO UPDATE + SET best_score = CASE WHEN datastore.course_records.best_score > $5 THEN $5 ELSE datastore.course_records.best_score END, + best_pid = CASE WHEN datastore.course_records.best_score > $5 THEN $4 ELSE datastore.course_records.best_pid END, + update_date = CASE WHEN datastore.course_records.best_score > $5 THEN $7 ELSE datastore.course_records.update_date END`, + dataID, + slot, + pid, + pid, + score, + now, + now, + ) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/super-mario-maker/insert_or_update_custom_ranking.go b/database/datastore/super-mario-maker/insert_or_update_custom_ranking.go new file mode 100644 index 0000000..db474f2 --- /dev/null +++ b/database/datastore/super-mario-maker/insert_or_update_custom_ranking.go @@ -0,0 +1,38 @@ +package datastore_smm_db + +import ( + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func InsertOrUpdateCustomRanking(dataID uint64, applicationID, score uint32) uint32 { + errCode := datastore_db.IsObjectAvailable(dataID) + if errCode != 0 { + globals.Logger.Errorf("Error code %d", errCode) + return errCode + } + + _, err := database.Postgres.Exec(`INSERT INTO datastore.object_custom_rankings ( + data_id, + application_id, + value + ) VALUES ( + $1, + $2, + $3 + ) ON CONFLICT (data_id, application_id) DO UPDATE SET value=datastore.object_custom_rankings.value+EXCLUDED.value`, + dataID, + applicationID, + score, + ) + + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/update_object_data_type_by_data_id_with_password.go b/database/datastore/update_object_data_type_by_data_id_with_password.go new file mode 100644 index 0000000..1f19124 --- /dev/null +++ b/database/datastore/update_object_data_type_by_data_id_with_password.go @@ -0,0 +1,47 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func UpdateObjectPeriodByDataIDWithPassword(dataID uint64, dataType uint16, password uint64) uint32 { + var updatePassword uint64 + var underReview bool + + err := database.Postgres.QueryRow(`SELECT update_password, under_review FROM datastore.objects WHERE data_id=$1 AND upload_completed=TRUE AND deleted=FALSE`, dataID).Scan( + &updatePassword, + &underReview, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + if updatePassword != 0 && updatePassword != password { + return nex.Errors.DataStore.InvalidPassword + } + + if underReview { + return nex.Errors.DataStore.UnderReviewing + } + + _, err = database.Postgres.Exec(`UPDATE datastore.objects SET data_type=$1 WHERE data_id=$2`, dataType, dataID) + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/update_object_meta_binary_by_data_id_with_password.go b/database/datastore/update_object_meta_binary_by_data_id_with_password.go new file mode 100644 index 0000000..2df7517 --- /dev/null +++ b/database/datastore/update_object_meta_binary_by_data_id_with_password.go @@ -0,0 +1,47 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func UpdateObjectMetaBinaryByDataIDWithPassword(dataID uint64, metaBinary []byte, password uint64) uint32 { + var updatePassword uint64 + var underReview bool + + err := database.Postgres.QueryRow(`SELECT update_password, under_review FROM datastore.objects WHERE data_id=$1 AND upload_completed=TRUE AND deleted=FALSE`, dataID).Scan( + &updatePassword, + &underReview, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + if updatePassword != 0 && updatePassword != password { + return nex.Errors.DataStore.InvalidPassword + } + + if underReview { + return nex.Errors.DataStore.UnderReviewing + } + + _, err = database.Postgres.Exec(`UPDATE datastore.objects SET meta_binary=$1 WHERE data_id=$2`, metaBinary, dataID) + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/update_object_period_by_data_id_with_password.go b/database/datastore/update_object_period_by_data_id_with_password.go new file mode 100644 index 0000000..cfd6219 --- /dev/null +++ b/database/datastore/update_object_period_by_data_id_with_password.go @@ -0,0 +1,47 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func UpdateObjectDataTypeByDataIDWithPassword(dataID uint64, period uint16, password uint64) uint32 { + var updatePassword uint64 + var underReview bool + + err := database.Postgres.QueryRow(`SELECT update_password, under_review FROM datastore.objects WHERE data_id=$1 AND upload_completed=TRUE AND deleted=FALSE`, dataID).Scan( + &updatePassword, + &underReview, + ) + + if err != nil { + if err == sql.ErrNoRows { + return nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + if updatePassword != 0 && updatePassword != password { + return nex.Errors.DataStore.InvalidPassword + } + + if underReview { + return nex.Errors.DataStore.UnderReviewing + } + + _, err = database.Postgres.Exec(`UPDATE datastore.objects SET period=$1 WHERE data_id=$2`, period, dataID) + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/update_object_upload_completed_by_data_id.go b/database/datastore/update_object_upload_completed_by_data_id.go new file mode 100644 index 0000000..b60315d --- /dev/null +++ b/database/datastore/update_object_upload_completed_by_data_id.go @@ -0,0 +1,38 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func UpdateObjectUploadCompletedByDataID(dataID uint64, uploadCompleted bool) uint32 { + var underReview bool + + err := database.Postgres.QueryRow(`SELECT update_password FROM datastore.objects WHERE data_id=$1 AND deleted=FALSE`, dataID).Scan(&underReview) + if err != nil { + if err == sql.ErrNoRows { + return nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + if underReview { + return nex.Errors.DataStore.UnderReviewing + } + + _, err = database.Postgres.Exec(`UPDATE datastore.objects SET upload_completed=$1 WHERE data_id=$2`, uploadCompleted, dataID) + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/get_buffer_queue_death_data.go b/database/get_buffer_queue_death_data.go deleted file mode 100644 index 19a8148..0000000 --- a/database/get_buffer_queue_death_data.go +++ /dev/null @@ -1,31 +0,0 @@ -package database - -import ( - "database/sql" - - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func GetBufferQueueDeathData(dataID uint64) [][]byte { - pBufferQueue := make([][]byte, 0) - - rows, err := Postgres.Query(`SELECT buffer FROM pretendo_smm.buffer_queues WHERE data_id=$1 AND slot=3`, dataID) - if err != nil { - globals.Logger.Critical(err.Error()) - return pBufferQueue - } - - for rows.Next() { - var buffer []byte - - err := rows.Scan(&buffer) - if err != nil && err != sql.ErrNoRows { - globals.Logger.Critical(err.Error()) - return pBufferQueue - } - - pBufferQueue = append(pBufferQueue, buffer) - } - - return pBufferQueue -} diff --git a/database/get_course_metadata_by_data_id.go b/database/get_course_metadata_by_data_id.go deleted file mode 100644 index 1fb91da..0000000 --- a/database/get_course_metadata_by_data_id.go +++ /dev/null @@ -1,56 +0,0 @@ -package database - -import ( - "database/sql" - "log" - - "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/super-mario-maker-secure/types" -) - -func GetCourseMetadataByDataID(dataID uint64) *types.CourseMetadata { - var ownerPID uint32 - var size uint32 - var name string - var metaBinary []byte - var flag uint32 - var createdTime uint64 - var updatedTime uint64 - var dataType uint16 - var period uint16 - - err := Postgres.QueryRow(`SELECT owner_pid, size, name, meta_binary, flag, creation_date, update_date, data_type, period FROM pretendo_smm.courses WHERE data_id=$1`, dataID).Scan(&ownerPID, &size, &name, &metaBinary, &flag, &createdTime, &updatedTime, &dataType, &period) - if err != nil { - if err == sql.ErrNoRows { - return nil - } else { - log.Fatal(err) - } - } - - var stars uint32 - var attempts uint32 - var failures uint32 - var completions uint32 - - _ = Postgres.QueryRow(`SELECT stars, attempts, failures, completions FROM pretendo_smm.ratings WHERE data_id=$1`, dataID).Scan(&stars, &attempts, &failures, &completions) - - courseMetadata := &types.CourseMetadata{ - DataID: dataID, - OwnerPID: ownerPID, - Size: size, - CreatedTime: nex.NewDateTime(createdTime), - UpdatedTime: nex.NewDateTime(updatedTime), - Name: name, - MetaBinary: metaBinary, - Stars: stars, - Attempts: attempts, - Failures: failures, - Completions: completions, - Flag: flag, - DataType: dataType, - Period: period, - } - - return courseMetadata -} diff --git a/database/get_course_metadata_by_data_ids.go b/database/get_course_metadata_by_data_ids.go deleted file mode 100644 index 49f2185..0000000 --- a/database/get_course_metadata_by_data_ids.go +++ /dev/null @@ -1,18 +0,0 @@ -package database - -import "github.com/PretendoNetwork/super-mario-maker-secure/types" - -func GetCourseMetadataByDataIDs(dataIDs []uint64) []*types.CourseMetadata { - // TODO: Do this in one query? - courseMetadatas := make([]*types.CourseMetadata, 0) - - for _, dataID := range dataIDs { - courseMetadata := GetCourseMetadataByDataID(dataID) - - if courseMetadata != nil { - courseMetadatas = append(courseMetadatas, courseMetadata) - } - } - - return courseMetadatas -} diff --git a/database/get_course_metadatas_by_limit.go b/database/get_course_metadatas_by_limit.go deleted file mode 100644 index 5be8bce..0000000 --- a/database/get_course_metadatas_by_limit.go +++ /dev/null @@ -1,76 +0,0 @@ -package database - -import ( - "database/sql" - "log" - - "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/types" -) - -func GetCourseMetadatasByLimit(limit uint32) []*types.CourseMetadata { - rows, err := Postgres.Query(`SELECT data_id, owner_pid, size, name, meta_binary, flag, creation_date, update_date, data_type, period FROM pretendo_smm.courses LIMIT $1`, limit) - if err != nil { - log.Fatal(err) - } - - courseMetadatas := make([]*types.CourseMetadata, 0) - - for rows.Next() { - var dataID uint64 - var ownerPID uint32 - var size uint32 - var name string - var metaBinary []byte - var flag uint32 - var creationDate uint64 - var updateDate uint64 - var dataType uint16 - var period uint16 - - err := rows.Scan( - &dataID, - &ownerPID, - &size, - &name, - &metaBinary, - &flag, - &creationDate, - &updateDate, - &dataType, - &period, - ) - if err != nil && err != sql.ErrNoRows { - globals.Logger.Critical(err.Error()) - } - - var stars uint32 - var attempts uint32 - var failures uint32 - var completions uint32 - - _ = Postgres.QueryRow(`SELECT stars, attempts, failures, completions FROM pretendo_smm.ratings WHERE data_id=$1`, dataID).Scan(&stars, &attempts, &failures, &completions) - - courseMetadata := &types.CourseMetadata{ - DataID: dataID, - OwnerPID: ownerPID, - Size: size, - CreatedTime: nex.NewDateTime(creationDate), - UpdatedTime: nex.NewDateTime(updateDate), - Name: name, - MetaBinary: metaBinary, - Stars: stars, - Attempts: attempts, - Failures: failures, - Completions: completions, - Flag: flag, - DataType: dataType, - Period: period, - } - - courseMetadatas = append(courseMetadatas, courseMetadata) - } - - return courseMetadatas -} diff --git a/database/get_course_metadatas_by_pid.go b/database/get_course_metadatas_by_pid.go deleted file mode 100644 index 32cba58..0000000 --- a/database/get_course_metadatas_by_pid.go +++ /dev/null @@ -1,32 +0,0 @@ -package database - -import ( - "database/sql" - "log" - - "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/types" -) - -func GetCourseMetadatasByPID(pid uint32) []*types.CourseMetadata { - courseMetadatas := make([]*types.CourseMetadata, 0) - - rows, err := Postgres.Query(`SELECT data_id FROM pretendo_smm.courses WHERE owner_pid=$1`, pid) - if err != nil { - log.Fatal(err) - } - - for rows.Next() { - var dataID uint64 - - err := rows.Scan(&dataID) - if err != nil && err != sql.ErrNoRows { - globals.Logger.Critical(err.Error()) - return courseMetadatas - } - - courseMetadatas = append(courseMetadatas, GetCourseMetadataByDataID(dataID)) - } - - return courseMetadatas -} diff --git a/database/get_course_world_record.go b/database/get_course_world_record.go deleted file mode 100644 index 61a6750..0000000 --- a/database/get_course_world_record.go +++ /dev/null @@ -1,28 +0,0 @@ -package database - -import ( - "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/super-mario-maker-secure/types" -) - -func GetCourseWorldRecord(dataID uint64) *types.CourseWorldRecord { - var worldRecordFirstPID uint32 - var worldRecordPID uint32 - var worldRecordCreatedTime uint64 - var worldRecordUpdatedTime uint64 - var worldRecord int32 - - _ = Postgres.QueryRow(`SELECT world_record_first_pid, world_record_pid, world_record_creation_date, world_record_update_date, world_record FROM pretendo_smm.courses WHERE data_id=$1`, dataID).Scan(&worldRecordFirstPID, &worldRecordPID, &worldRecordCreatedTime, &worldRecordUpdatedTime, &worldRecord) - - if worldRecordFirstPID == 0 { - return nil - } - - return &types.CourseWorldRecord{ - FirstPID: worldRecordFirstPID, - BestPID: worldRecordPID, - CreatedTime: nex.NewDateTime(worldRecordCreatedTime), - UpdatedTime: nex.NewDateTime(worldRecordUpdatedTime), - Score: worldRecord, - } -} diff --git a/database/get_user_mii_info_by_pid.go b/database/get_user_mii_info_by_pid.go deleted file mode 100644 index 18288c8..0000000 --- a/database/get_user_mii_info_by_pid.go +++ /dev/null @@ -1,21 +0,0 @@ -package database - -import ( - "context" - - pb "github.com/PretendoNetwork/grpc-go/account" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "google.golang.org/grpc/metadata" -) - -func GetUserMiiInfoByPID(pid uint32) *pb.Mii { - ctx := metadata.NewOutgoingContext(context.Background(), globals.GRPCAccountCommonMetadata) - - response, err := globals.GRPCAccountClient.GetUserData(ctx, &pb.GetUserDataRequest{Pid: pid}) - if err != nil { - globals.Logger.Error(err.Error()) - return nil - } - - return response.Mii -} diff --git a/database/get_user_starred_courses.go b/database/get_user_starred_courses.go deleted file mode 100644 index 47f5239..0000000 --- a/database/get_user_starred_courses.go +++ /dev/null @@ -1,20 +0,0 @@ -package database - -import ( - "log" - - "github.com/PretendoNetwork/super-mario-maker-secure/types" -) - -func GetUserStarredCourses(pid uint32) []*types.CourseMetadata { - var dataIDs []uint64 - - rows, err := Postgres.Query(`SELECT starred_courses FROM pretendo_smm.user_play_info WHERE pid=$1`, pid) - if err != nil { - log.Fatal(err) - } - - rows.Scan(&dataIDs) - - return GetCourseMetadataByDataIDs(dataIDs) -} diff --git a/database/increment_course_attempt_count.go b/database/increment_course_attempt_count.go deleted file mode 100644 index 1501b64..0000000 --- a/database/increment_course_attempt_count.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func IncrementCourseAttemptCount(courseID uint64) { - _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET attempts=attempts+1 WHERE data_id=$1`, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/increment_course_clear_count.go b/database/increment_course_clear_count.go deleted file mode 100644 index cac63bd..0000000 --- a/database/increment_course_clear_count.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func IncrementCourseClearCount(courseID uint64) { - _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET completions=completions+1 WHERE data_id=$1`, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/increment_course_fail_count.go b/database/increment_course_fail_count.go deleted file mode 100644 index c9b8e28..0000000 --- a/database/increment_course_fail_count.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func IncrementCourseFailCount(courseID uint64) { - _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET failures=failures+1 WHERE data_id=$1`, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/increment_course_star_count.go b/database/increment_course_star_count.go deleted file mode 100644 index c97aa66..0000000 --- a/database/increment_course_star_count.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func IncrementCourseStarCount(courseID uint64) { - _, err := Postgres.Exec(`UPDATE pretendo_smm.ratings SET stars=stars+1 WHERE data_id=$1`, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/init_postgres.go b/database/init_postgres.go index 48c2314..c211c98 100644 --- a/database/init_postgres.go +++ b/database/init_postgres.go @@ -1,100 +1,281 @@ package database import ( + "os" + "time" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" + "github.com/lib/pq" ) func initPostgres() { - _, err := Postgres.Exec(`CREATE SCHEMA IF NOT EXISTS pretendo_smm`) + _, err := Postgres.Exec(`CREATE SCHEMA IF NOT EXISTS datastore`) if err != nil { globals.Logger.Critical(err.Error()) - return + os.Exit(0) } - globals.Logger.Success("pretendo_smm Postgres schema created") + globals.Logger.Success("datastore Postgres schema created") // * Super Mario Maker has non-standard DataID requirements. // * DataID 900000 is reserved for the event course metadata - // * file, so to prevent a collision eventually, we need to - // * start course IDs AFTER 900000. DataIDs are stored and - // * processed as uint64, however Super Mario Maker can not - // * use the full uint64 range. This is because course share - // * codes are generated from the courses DataID. A course - // * share code is an 8 byte hex string, where the upper 2 - // * bytes are the checksum of the lower 6 bytes. The lower - // * 6 bytes are the courses DataID. Super Mario Maker is - // * only capable of displaying codes up to 0xFFFFFFFFFFFF, - // * essentially truncating DataIDs down to 48 bit integers - // * instead of 64 bit. I doubt we will ever hit even the 32 - // * bit limit, let alone 48, but this is here just in case - _, err = Postgres.Exec(`CREATE SEQUENCE IF NOT EXISTS pretendo_smm.courses_seq + // * file, and official event courses begin at DataID 930010 + // * and end at DataID 930050. To prevent a collision + // * eventually, we need to start course IDs AFTER 930050 + // * + // * DataIDs are stored and processed as uint64, however + // * Super Mario Maker can not use the full uint64 range. + // * This is because course share codes are generated from the + // * courses DataID. A course share code is an 8 byte hex + // * string, where the upper 2 bytes are the checksum of the + // * lower 6 bytes. The lower 6 bytes are the courses DataID + // * + // * Super Mario Maker is only capable of displaying codes up + // * to 0xFFFFFFFFFFFF, essentially truncating DataIDs down to + // * 48 bit integers instead of 64 bit. I doubt we will ever + // * hit even the 32 bit limit, let alone 48, but this is here + // * just in case + _, err = Postgres.Exec(`CREATE SEQUENCE IF NOT EXISTS datastore.object_data_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 281474976710656 - START 900001 - CACHE 1`, + START 940000 + CACHE 1`, // * Honestly I don't know what CACHE does but I saw it recommended so here it is ) if err != nil { globals.Logger.Critical(err.Error()) - return + os.Exit(0) } - _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.courses ( - data_id int NOT NULL DEFAULT nextval('pretendo_smm.courses_seq') PRIMARY KEY, - playable boolean, - owner_pid int, - name text, + // * "deletion_reason" and "under_review" are specific to SMM. + // * Everything else is stock + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS datastore.objects ( + data_id bigint NOT NULL DEFAULT nextval('datastore.object_data_id_seq') PRIMARY KEY, + upload_completed boolean NOT NULL DEFAULT FALSE, + deleted boolean NOT NULL DEFAULT FALSE, + deletion_reason int NOT NULL DEFAULT 0, + under_review boolean NOT NULL DEFAULT FALSE, + owner int, size int, - creation_date bigint, - update_date bigint, - world_record_first_pid int, - world_record_pid int, - world_record_creation_date bigint, - world_record_update_date bigint, - world_record int, + name text, + data_type int, meta_binary bytea, + permission int, + permission_recipients int[], + delete_permission int, + delete_permission_recipients int[], flag int, + period int, + refer_data_id bigint, + tags text[], + persistence_slot_id int, extra_data text[], - data_type smallint, - period smallint + access_password bigint NOT NULL DEFAULT 0, + update_password bigint NOT NULL DEFAULT 0, + creation_date timestamp, + update_date timestamp )`) if err != nil { globals.Logger.Critical(err.Error()) - return + os.Exit(0) } - _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.ratings ( - data_id bigint PRIMARY KEY, - stars serial, - attempts serial, - failures serial, - completions serial + // * Unsure what like half of this is but the client sends it so we saves it + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS datastore.object_ratings ( + data_id bigint, + slot smallint, + flag smallint, + internal_flag smallint, + lock_type smallint, + initial_value bigint, + range_min int, + range_max int, + period_hour smallint, + period_duration int, + total_value bigint, + count int NOT NULL DEFAULT 0, + PRIMARY KEY(data_id, slot) )`) if err != nil { globals.Logger.Critical(err.Error()) - return + os.Exit(0) } - _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.buffer_queues ( - id uuid PRIMARY KEY, + // * Custom rankings are specific to SMM + // TODO - Store the period? What even is the period of custom rankings? + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS datastore.object_custom_rankings ( + data_id bigint, + application_id bigint, + value bigint, + PRIMARY KEY(data_id, application_id) + )`) + if err != nil { + globals.Logger.Critical(err.Error()) + os.Exit(0) + } + + // * BufferQueues are specific to SMM + // * Real server does not allow duplicate buffers in a given slot for an object, + // * even if uploaded by different users. We could change this, but I don't see + // * much point + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS datastore.buffer_queues ( data_id bigint, slot int, - buffer bytea + creation_date timestamp, + buffer bytea, + PRIMARY KEY(data_id, slot, buffer) )`) if err != nil { globals.Logger.Critical(err.Error()) - return + os.Exit(0) } - _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS pretendo_smm.user_play_info ( - pid int PRIMARY KEY, - starred_courses bigint[], - played_courses bigint[] + // * Course records are specific to SMM + _, err = Postgres.Exec(`CREATE TABLE IF NOT EXISTS datastore.course_records ( + data_id bigint, + slot int, + first_pid int, + best_pid int, + best_score int, + creation_date timestamp, + update_date timestamp, + PRIMARY KEY(data_id, slot) )`) if err != nil { globals.Logger.Critical(err.Error()) - return + os.Exit(0) } globals.Logger.Success("Postgres tables created") + + ensureEventCourseMetaDataFileExists() +} + +func ensureEventCourseMetaDataFileExists() { + // * The event course metadata file is REQUIRED for + // * Super Mario Maker to open Course World. This + // * ensures that it exists both in S3 and in the + // * database before booting. It has the reserved + // * DataID 900000 + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := "900000.bin" + + objectSizeS3, err := globals.S3ObjectSize(bucket, key) + if err != nil { + globals.Logger.Errorf("Failed to stat event course metadata file. Ensure your S3 credentials are correct and the 900000.bin file is uploaded to your bucket. S3 error: %s", err.Error()) + os.Exit(0) + } + + globals.Logger.Success("Event course metadata file found. Verifying database") + + var exists bool + err = Postgres.QueryRow(`SELECT EXISTS(SELECT 1 FROM datastore.objects WHERE data_id=900000) AS "exists"`).Scan(&exists) + if err != nil { + globals.Logger.Errorf("Error querying for event course metadata object in Postgres: %s", err.Error()) + os.Exit(0) + } + + now := time.Now() + + if !exists { + var dataID uint64 + + globals.Logger.Info("Event course metadata object not found in Postgres. Creating") + + err := Postgres.QueryRow(`INSERT INTO datastore.objects ( + data_id, + upload_completed, + owner, + size, + name, + data_type, + meta_binary, + permission, + permission_recipients, + delete_permission, + delete_permission_recipients, + flag, + period, + refer_data_id, + tags, + persistence_slot_id, + extra_data, + creation_date, + update_date + ) VALUES ( + $1, + $2, + $3, + $4, + $5, + $6, + $7, + $8, + $9, + $10, + $11, + $12, + $13, + $14, + $15, + $16, + $17, + $18, + $19 + ) RETURNING data_id`, + 900000, + true, + 2, // * "Quazal Rendez-Vous" special account + objectSizeS3, + "", // * Has no name + 50, // * Metadata file has DataType 50. Event courses have DataType 51 + []byte{}, // * No MetaBinary + 0, // * Accessible by everyone + pq.Array([]uint32{}), + 3, // * THE REAL SERVER HAS THIS SET TO 0, FOR EVERYONE. THAT'S SUPER INSECURE. + pq.Array([]uint32{}), + 0, + 64306, + 0, + pq.Array([]string{}), + 0, // * Unsure what the slot ID actually is + pq.Array([]string{}), + now, + now, + ).Scan(&dataID) + if err != nil { + globals.Logger.Errorf("Error creating event course metadata object: %s", err.Error()) + os.Exit(0) + } + } else { + var objectSizeDB uint32 + + err := Postgres.QueryRow(`SELECT size FROM datastore.objects WHERE data_id=900000`).Scan(&objectSizeDB) + if err != nil { + globals.Logger.Errorf("Error querying event course metadata object size: %s", err.Error()) + os.Exit(0) + } + + if objectSizeS3 != uint64(objectSizeDB) { + globals.Logger.Success("Event course metadata object found in Postgres! Updating size") + + _, err := Postgres.Exec(`UPDATE datastore.objects SET size=$1, update_date=$2 WHERE data_id=900000`, objectSizeS3, now) + if err != nil { + globals.Logger.Errorf("Error updating event course metadata object size: %s", err.Error()) + os.Exit(0) + } + } else { + globals.Logger.Success("Event course metadata object found in Postgres!") + } + + globals.Logger.Info("Ensuring event course metadata object has correct delete permission") + + _, err = Postgres.Exec(`UPDATE datastore.objects SET delete_permission=3 WHERE data_id=900000`) + if err != nil { + globals.Logger.Errorf("Error updating event course metadata object delete permission: %s", err.Error()) + os.Exit(0) + } + } + + globals.Logger.Success("Event course metadata object found and is up to date!") } diff --git a/database/initialize_course_data.go b/database/initialize_course_data.go deleted file mode 100644 index ac7012a..0000000 --- a/database/initialize_course_data.go +++ /dev/null @@ -1,73 +0,0 @@ -package database - -import ( - "log" - - "github.com/PretendoNetwork/nex-go" - "github.com/lib/pq" -) - -func InitializeCourseData(ownerPID uint32, size uint32, name string, flag uint32, extraData []string, dataType uint16, period uint16) uint64 { - datetime := nex.NewDateTime(0) - now := datetime.Now() - var dataID uint64 - - err := Postgres.QueryRow(`INSERT INTO pretendo_smm.courses( - owner_pid, - size, - name, - flag, - extra_data, - playable, - creation_date, - update_date, - world_record_first_pid, - world_record_pid, - world_record_creation_date, - world_record_update_date, - world_record, - data_type, - period - ) - VALUES ( - $1, - $2, - $3, - $4, - $5, - false, - $6, - $7, - 0, - 0, - 0, - 0, - 0, - $8, - $9 - ) RETURNING data_id`, ownerPID, size, name, flag, pq.Array(extraData), now, now, dataType, period).Scan(&dataID) - - if err != nil { - log.Fatal(err) - } - - _, err = Postgres.Exec(`INSERT INTO pretendo_smm.ratings ( - data_id, - stars, - attempts, - failures, - completions - ) - VALUES ( - $1, - 0, - 0, - 0, - 0 - )`, dataID) - if err != nil { - log.Fatal(err) - } - - return dataID -} diff --git a/database/insert_buffer_queue_data.go b/database/insert_buffer_queue_data.go deleted file mode 100644 index 612dfe0..0000000 --- a/database/insert_buffer_queue_data.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func InsertBufferQueueData(dataID uint64, slot uint32, buffer []byte) { - _, err := Postgres.Exec(`INSERT INTO pretendo_smm.buffer_queues( id, data_id, slot, buffer ) VALUES ( gen_random_uuid(), $1, $2, $3 ) ON CONFLICT DO NOTHING`, dataID, slot, buffer) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/set_course_playable.go b/database/set_course_playable.go deleted file mode 100644 index d8e3f3b..0000000 --- a/database/set_course_playable.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func SetCoursePlayable(courseID uint64) { - _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET playable=true WHERE data_id=$1`, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/update_course_meta_binary.go b/database/update_course_meta_binary.go deleted file mode 100644 index b09a3df..0000000 --- a/database/update_course_meta_binary.go +++ /dev/null @@ -1,10 +0,0 @@ -package database - -import "log" - -func UpdateCourseMetaBinary(courseID uint64, metaBinary []byte) { - _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET meta_binary=$1 WHERE data_id=$2`, metaBinary, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/database/update_course_world_record.go b/database/update_course_world_record.go deleted file mode 100644 index 749b984..0000000 --- a/database/update_course_world_record.go +++ /dev/null @@ -1,24 +0,0 @@ -package database - -import ( - "log" - - "github.com/PretendoNetwork/nex-go" -) - -func UpdateCourseWorldRecord(courseID uint64, ownerPID uint32, score int32) { - datetime := nex.NewDateTime(0) - now := datetime.Now() - - if GetCourseWorldRecord(courseID) == nil { - _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET world_record_first_pid=$1, world_record_creation_date=$2 WHERE data_id=$3`, ownerPID, now, courseID) - if err != nil { - log.Fatal(err) - } - } - - _, err := Postgres.Exec(`UPDATE pretendo_smm.courses SET world_record_pid=$1, world_record_update_date=$2, world_record=$3 WHERE data_id=$4`, ownerPID, now, score, courseID) - if err != nil { - log.Fatal(err) - } -} diff --git a/globals/s3_helpers.go b/globals/s3_helpers.go new file mode 100644 index 0000000..24f37f6 --- /dev/null +++ b/globals/s3_helpers.go @@ -0,0 +1,20 @@ +package globals + +import ( + "context" + + "github.com/minio/minio-go/v7" +) + +func S3StatObject(bucket, key string) (minio.ObjectInfo, error) { + return MinIOClient.StatObject(context.TODO(), bucket, key, minio.StatObjectOptions{}) +} + +func S3ObjectSize(bucket, key string) (uint64, error) { + info, err := S3StatObject(bucket, key) + if err != nil { + return 0, err + } + + return uint64(info.Size), nil +} diff --git a/globals/verify_object_permission.go b/globals/verify_object_permission.go new file mode 100644 index 0000000..b585307 --- /dev/null +++ b/globals/verify_object_permission.go @@ -0,0 +1,40 @@ +package globals + +import ( + "github.com/PretendoNetwork/nex-go" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + "golang.org/x/exp/slices" +) + +func VerifyObjectPermission(ownerPID, accessorPID uint32, permission *datastore_types.DataStorePermission) uint32 { + if permission.Permission > 3 { + return nex.Errors.DataStore.InvalidArgument + } + + // * Allow anyone + if permission.Permission == 0 { + return 0 + } + + // * Allow friends + // TODO - Implement this + if permission.Permission == 1 { + return nex.Errors.DataStore.PermissionDenied + } + + // * Allow people in permission.RecipientIDs + if permission.Permission == 2 { + if !slices.Contains(permission.RecipientIDs, accessorPID) { + return nex.Errors.DataStore.PermissionDenied + } + } + + // * Allow only the owner + if permission.Permission == 3 { + if ownerPID != accessorPID { + return nex.Errors.DataStore.PermissionDenied + } + } + + return 0 +} diff --git a/go.mod b/go.mod index c7bd0e8..495534d 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,17 @@ module github.com/PretendoNetwork/super-mario-maker-secure -go 1.19 +go 1.21 require ( github.com/PretendoNetwork/grpc-go v1.0.2 github.com/PretendoNetwork/nex-go v1.0.41 - github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 + github.com/PretendoNetwork/nex-protocols-common-go v1.0.29 github.com/PretendoNetwork/nex-protocols-go v1.0.55 github.com/PretendoNetwork/plogger-go v1.0.4 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 github.com/minio/minio-go/v7 v7.0.63 + golang.org/x/exp v0.0.0-20231006140011-7918f672742d google.golang.org/grpc v1.59.0 ) @@ -18,10 +19,10 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/fatih/color v1.15.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jwalton/go-supportscolor v1.2.0 // indirect - github.com/klauspost/compress v1.17.1 // indirect + github.com/klauspost/compress v1.17.2 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -33,7 +34,6 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/superwhiskers/crunch/v3 v3.5.7 // indirect golang.org/x/crypto v0.14.0 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/mod v0.13.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect diff --git a/go.sum b/go.sum index 79bee92..3b06031 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/PretendoNetwork/grpc-go v1.0.2 h1:9TvKmX7dCOANyoHEra1MMYqS1N/RGav66TR github.com/PretendoNetwork/grpc-go v1.0.2/go.mod h1:XZjEsij9lL7HJBNkH6JPbBIkUSq/1rjflvjGdv+DAj0= github.com/PretendoNetwork/nex-go v1.0.41 h1:TcBb1Bpe2KAB+AXaGX1K9NVQBRtZJIoy4yCvRde2xbI= github.com/PretendoNetwork/nex-go v1.0.41/go.mod h1:QwHEa165DeVd0xIuthrgc3j6NWXT8lyPSG6t5kC/Shk= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.28 h1:ErkWga7Uzn4WoDU8Q/Sy+geHy0fF0G/5wFnL5i6hngI= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.28/go.mod h1:4jYhLg+Cb2qhJHyyA+f2OwCrmc98zuTO3JPWK22mIKw= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.29 h1:ZvZNsAbdgWIGggZhn6EePuyYqI34FuV4C+fMkmmwWSA= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.29/go.mod h1:4jYhLg+Cb2qhJHyyA+f2OwCrmc98zuTO3JPWK22mIKw= github.com/PretendoNetwork/nex-protocols-go v1.0.55 h1:8QMeCNO2eZO4m7CRT/nv2WWm+gDh/REKR5jKTYQaaCs= github.com/PretendoNetwork/nex-protocols-go v1.0.55/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= @@ -20,17 +20,18 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= -github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= -github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= diff --git a/nex/datastore/change_meta.go b/nex/datastore/change_meta.go index d08cefc..15741fe 100644 --- a/nex/datastore/change_meta.go +++ b/nex/datastore/change_meta.go @@ -4,12 +4,49 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func ChangeMeta(err error, client *nex.Client, callID uint32, dataStoreChangeMetaParam *datastore_types.DataStoreChangeMetaParam) uint32 { - // STUBBED - // TODO: DO SOMETHING WITH THE DATA +func ChangeMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreChangeMetaParam) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + metaInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID) + if errCode != 0 { + return errCode + } + + // TODO - Is this the right permission? + errCode = globals.VerifyObjectPermission(metaInfo.OwnerID, client.PID(), metaInfo.DelPermission) + if errCode != 0 { + return errCode + } + + // TODO - Refactor this into a single query. Use a query builder like goqu? + if param.ModifiesFlag&0x08 == 0x08 { + errCode = datastore_db.UpdateObjectPeriodByDataIDWithPassword(param.DataID, param.Period, param.UpdatePassword) + if errCode != 0 { + return errCode + } + } + + if param.ModifiesFlag&0x10 == 0x10 { + errCode = datastore_db.UpdateObjectMetaBinaryByDataIDWithPassword(param.DataID, param.MetaBinary, param.UpdatePassword) + if errCode != 0 { + return errCode + } + } + + if param.ModifiesFlag&0x80 == 0x80 { + errCode = datastore_db.UpdateObjectDataTypeByDataIDWithPassword(param.DataID, param.DataType, param.UpdatePassword) + if errCode != 0 { + return errCode + } + } + rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) rmcResponse.SetSuccess(datastore.MethodChangeMeta, nil) diff --git a/nex/datastore/complete_post_object.go b/nex/datastore/complete_post_object.go index c2752bf..02ce39e 100644 --- a/nex/datastore/complete_post_object.go +++ b/nex/datastore/complete_post_object.go @@ -1,14 +1,48 @@ package nex_datastore import ( + "fmt" + "os" + nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompletePostObject(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) uint32 { - // TODO: DO SOMETHING WITH THE DATA +func CompletePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreCompletePostParam) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + // TODO - What is param.IsSuccess? Is this correct? + if param.IsSuccess { + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.bin", param.DataID) + + objectSizeS3, err := globals.S3ObjectSize(bucket, key) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.NotFound + } + + objectSizeDB, errCode := datastore_db.GetObjectSizeDataID(param.DataID) + if errCode != 0 { + return errCode + } + + if objectSizeS3 != uint64(objectSizeDB) { + // TODO - Is this a good error? + return nex.Errors.DataStore.Unknown + } + + errCode = datastore_db.UpdateObjectUploadCompletedByDataID(param.DataID, true) + if errCode != 0 { + return errCode + } + } rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) rmcResponse.SetSuccess(datastore.MethodCompletePostObject, nil) diff --git a/nex/datastore/get_meta.go b/nex/datastore/get_meta.go index db04102..4336470 100644 --- a/nex/datastore/get_meta.go +++ b/nex/datastore/get_meta.go @@ -1,107 +1,81 @@ package nex_datastore import ( - "fmt" - "os" - nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) func GetMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) uint32 { - switch param.DataID { - case 0: // Mii Data - getMetaMiiData(client, callID, param) - case 900000: // Event course news - getMetaEventCourseNewsData(client, callID, param) - default: - fmt.Printf("[Warning] DataStoreProtocol::GetMeta Unsupported dataId: %v\n", param.DataID) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown } + var pMetaInfo *datastore_types.DataStoreMetaInfo + var errCode uint32 + + // * Real server ignores PersistenceTarget if DataID is set + if param.DataID == 0 { + pMetaInfo, errCode = datastore_db.GetObjectInfoByPersistenceTargetWithPassword(param.PersistenceTarget, param.AccessPassword) + } else { + pMetaInfo, errCode = datastore_db.GetObjectInfoByDataIDWithPassword(param.DataID, param.AccessPassword) + } + + if errCode != 0 { + return errCode + } + + errCode = globals.VerifyObjectPermission(pMetaInfo.OwnerID, client.PID(), pMetaInfo.Permission) + if errCode != 0 { + return errCode + } + + // * This is kind of backwards. + // * The database pulls this data + // * by default, so it can be done + // * in a single query. So instead + // * of checking if a flag *IS* + // * set, and conditionally *ADDING* + // * the fields, we check if a flag + // * is *NOT* set and conditionally + // * *REMOVE* the field + if param.ResultOption&0x1 == 0 { + pMetaInfo.Tags = make([]string, 0) + } + + if param.ResultOption&0x2 == 0 { + pMetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + } + + if param.ResultOption&0x4 == 0 { + pMetaInfo.MetaBinary = make([]byte, 0) + } + + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) + rmcResponseStream.WriteStructure(pMetaInfo) + + rmcResponseBody := rmcResponseStream.Bytes() + + rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) + rmcResponse.SetSuccess(datastore.MethodGetMeta, rmcResponseBody) + + rmcResponseBytes := rmcResponse.Bytes() + + responsePacket, _ := nex.NewPacketV1(client, nil) + + responsePacket.SetVersion(1) + responsePacket.SetSource(0xA1) + responsePacket.SetDestination(0xAF) + responsePacket.SetType(nex.DataPacket) + responsePacket.SetPayload(rmcResponseBytes) + + responsePacket.AddFlag(nex.FlagNeedsAck) + responsePacket.AddFlag(nex.FlagReliable) + + globals.SecureServer.Send(responsePacket) + return 0 } - -func getMetaMiiData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { - miiInfo := database.GetUserMiiInfoByPID(param.PersistenceTarget.OwnerID) - - pMetaInfo := utility.UserMiiDataToDataStoreMetaInfo(param.PersistenceTarget.OwnerID, miiInfo) - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteStructure(pMetaInfo) - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodGetMeta, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) -} - -func getMetaEventCourseNewsData(client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) { - objectSize, _ := utility.S3ObjectSize(os.Getenv("PN_SMM_CONFIG_S3_BUCKET"), "900000.bin") - - pMetaInfo := datastore_types.NewDataStoreMetaInfo() - pMetaInfo.DataID = 900000 - pMetaInfo.OwnerID = 2 - pMetaInfo.Size = uint32(objectSize) - pMetaInfo.Name = "" - pMetaInfo.DataType = 50 // Metdata? - pMetaInfo.MetaBinary = []byte{} - pMetaInfo.Permission = datastore_types.NewDataStorePermission() - pMetaInfo.Permission.Permission = 0 // idk? - pMetaInfo.Permission.RecipientIDs = []uint32{} - pMetaInfo.DelPermission = datastore_types.NewDataStorePermission() - pMetaInfo.DelPermission.Permission = 0 // idk? - pMetaInfo.DelPermission.RecipientIDs = []uint32{} - pMetaInfo.CreatedTime = nex.NewDateTime(135271087238) // Reused from Nintendo - pMetaInfo.UpdatedTime = nex.NewDateTime(135402751254) // Reused from Nintendo - pMetaInfo.Period = 64306 // idk? - pMetaInfo.Status = 0 - pMetaInfo.ReferredCnt = 0 - pMetaInfo.ReferDataID = 0 - pMetaInfo.Flag = 0 // idk? - pMetaInfo.ReferredTime = nex.NewDateTime(135271087238) // Reused from Nintendo - pMetaInfo.ExpireTime = nex.NewDateTime(671075926016) // Reused from Nintendo - pMetaInfo.Tags = []string{} // idk? - pMetaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteStructure(pMetaInfo) - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodGetMeta, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) -} diff --git a/nex/datastore/get_metas_multiple_param.go b/nex/datastore/get_metas_multiple_param.go index f7524e5..899ffb8 100644 --- a/nex/datastore/get_metas_multiple_param.go +++ b/nex/datastore/get_metas_multiple_param.go @@ -1,34 +1,124 @@ package nex_datastore import ( - "fmt" - nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params []*datastore_types.DataStoreGetMetaParam) uint32 { - pMetaInfo := make([]*datastore_types.DataStoreMetaInfo, 0) - pResults := make([]uint32, 0) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + pMetaInfo := make([]*datastore_types.DataStoreMetaInfo, 0, len(params)) + pResults := make([]*nex.Result, 0, len(params)) for _, param := range params { + var objectInfo *datastore_types.DataStoreMetaInfo + var errCode uint32 + + // * Real server ignores PersistenceTarget if DataID is set if param.DataID == 0 { - pMetaInfo = append(pMetaInfo, getMetasMultipleParamMiiData(param)) + objectInfo, errCode = datastore_db.GetObjectInfoByPersistenceTargetWithPassword(param.PersistenceTarget, param.AccessPassword) } else { - fmt.Println("Unknown meta multiple data ID") + objectInfo, errCode = datastore_db.GetObjectInfoByDataIDWithPassword(param.DataID, param.AccessPassword) } - pResults = append(pResults, 0x690001) + if errCode != 0 { + // TODO - Maybe this should be broken out into a util function in globals? + objectInfo = datastore_types.NewDataStoreMetaInfo() + objectInfo.DataID = 0 + objectInfo.OwnerID = 0 + objectInfo.Size = 0 + objectInfo.Name = "" + objectInfo.DataType = 0 + objectInfo.MetaBinary = []byte{} + objectInfo.Permission = datastore_types.NewDataStorePermission() + objectInfo.Permission.Permission = 0 + objectInfo.Permission.RecipientIDs = []uint32{} + objectInfo.DelPermission = datastore_types.NewDataStorePermission() + objectInfo.DelPermission.Permission = 0 + objectInfo.DelPermission.RecipientIDs = []uint32{} + objectInfo.CreatedTime = nex.NewDateTime(0) + objectInfo.UpdatedTime = nex.NewDateTime(0) + objectInfo.Period = 0 + objectInfo.Status = 0 + objectInfo.ReferredCnt = 0 + objectInfo.ReferDataID = 0 + objectInfo.Flag = 0 + objectInfo.ReferredTime = nex.NewDateTime(0) + objectInfo.ExpireTime = nex.NewDateTime(0) + objectInfo.Tags = []string{} + objectInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} + + pResults = append(pResults, nex.NewResultError(errCode)) + } else { + errCode = globals.VerifyObjectPermission(objectInfo.OwnerID, client.PID(), objectInfo.Permission) + if errCode != 0 { + // TODO - Maybe this should be broken out into a util function in globals? + objectInfo = datastore_types.NewDataStoreMetaInfo() + objectInfo.DataID = 0 + objectInfo.OwnerID = 0 + objectInfo.Size = 0 + objectInfo.Name = "" + objectInfo.DataType = 0 + objectInfo.MetaBinary = []byte{} + objectInfo.Permission = datastore_types.NewDataStorePermission() + objectInfo.Permission.Permission = 0 + objectInfo.Permission.RecipientIDs = []uint32{} + objectInfo.DelPermission = datastore_types.NewDataStorePermission() + objectInfo.DelPermission.Permission = 0 + objectInfo.DelPermission.RecipientIDs = []uint32{} + objectInfo.CreatedTime = nex.NewDateTime(0) + objectInfo.UpdatedTime = nex.NewDateTime(0) + objectInfo.Period = 0 + objectInfo.Status = 0 + objectInfo.ReferredCnt = 0 + objectInfo.ReferDataID = 0 + objectInfo.Flag = 0 + objectInfo.ReferredTime = nex.NewDateTime(0) + objectInfo.ExpireTime = nex.NewDateTime(0) + objectInfo.Tags = []string{} + objectInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} + + pResults = append(pResults, nex.NewResultError(errCode)) + } else { + pResults = append(pResults, nex.NewResultSuccess(nex.Errors.Core.Unknown)) + } + + // * This is kind of backwards. + // * The database pulls this data + // * by default, so it can be done + // * in a single query. So instead + // * of checking if a flag *IS* + // * set, and conditionally *ADDING* + // * the fields, we check if a flag + // * is *NOT* set and conditionally + // * *REMOVE* the field + if param.ResultOption&0x1 == 0 { + objectInfo.Tags = make([]string, 0) + } + + if param.ResultOption&0x2 == 0 { + objectInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + } + + if param.ResultOption&0x4 == 0 { + objectInfo.MetaBinary = make([]byte, 0) + } + } + + pMetaInfo = append(pMetaInfo, objectInfo) } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pMetaInfo) - rmcResponseStream.WriteListUInt32LE(pResults) + rmcResponseStream.WriteListResult(pResults) rmcResponseBody := rmcResponseStream.Bytes() @@ -52,9 +142,3 @@ func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params return 0 } - -func getMetasMultipleParamMiiData(param *datastore_types.DataStoreGetMetaParam) *datastore_types.DataStoreMetaInfo { - miiInfo := database.GetUserMiiInfoByPID(param.PersistenceTarget.OwnerID) - - return utility.UserMiiDataToDataStoreMetaInfo(param.PersistenceTarget.OwnerID, miiInfo) -} diff --git a/nex/datastore/prepare_get_object.go b/nex/datastore/prepare_get_object.go index 6f3bb5e..163138d 100644 --- a/nex/datastore/prepare_get_object.go +++ b/nex/datastore/prepare_get_object.go @@ -8,25 +8,27 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePrepareGetParam *datastore_types.DataStorePrepareGetParam) uint32 { +func PrepareGetObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePrepareGetParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.Core.Unknown } - pReqGetInfo := datastore_types.NewDataStoreReqGetInfo() - bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.bin", dataStorePrepareGetParam.DataID) + key := fmt.Sprintf("%d.bin", param.DataID) - objectSize, err := utility.S3ObjectSize(bucket, key) - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.NotFound + objectInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID) + if errCode != 0 { + return errCode + } + + errCode = globals.VerifyObjectPermission(objectInfo.OwnerID, client.PID(), objectInfo.Permission) + if errCode != 0 { + return errCode } URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) @@ -35,11 +37,13 @@ func PrepareGetObject(err error, client *nex.Client, callID uint32, dataStorePre return nex.Errors.DataStore.OperationNotAllowed } + pReqGetInfo := datastore_types.NewDataStoreReqGetInfo() + pReqGetInfo.URL = URL.String() pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqGetInfo.Size = uint32(objectSize) + pReqGetInfo.Size = objectInfo.Size pReqGetInfo.RootCACert = []byte{} - pReqGetInfo.DataID = dataStorePrepareGetParam.DataID + pReqGetInfo.DataID = param.DataID rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go index 0285a6d..da2284d 100644 --- a/nex/datastore/prepare_post_object.go +++ b/nex/datastore/prepare_post_object.go @@ -8,15 +8,29 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePreparePostParam) uint32 { - dataID := database.InitializeCourseData(client.PID(), param.Size, param.Name, param.Flag, param.ExtraData, param.DataType, param.Period) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } - if param.DataType != 1 { // 1 is Mii data, assume other values are course meta data - database.UpdateCourseMetaBinary(dataID, param.MetaBinary) + dataID, errCode := datastore_db.InitializeObjectByPreparePostParam(client.PID(), param) + if errCode != 0 { + globals.Logger.Errorf("Error code %d on object init", errCode) + return errCode + } + + // TODO - Should this be moved to InitializeObjectByPreparePostParam? + for _, ratingInitParamWithSlot := range param.RatingInitParams { + errCode = datastore_db.InitializeObjectRatingWithSlot(dataID, ratingInitParamWithSlot) + if errCode != 0 { + globals.Logger.Errorf("Error code %d on rating init", errCode) + return errCode + } } bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") diff --git a/nex/datastore/rate_objects.go b/nex/datastore/rate_objects.go index f004a2a..1827338 100644 --- a/nex/datastore/rate_objects.go +++ b/nex/datastore/rate_objects.go @@ -4,16 +4,45 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore_types.DataStoreRatingTarget, params []*datastore_types.DataStoreRateObjectParam, transactional bool, fetchRatings bool) uint32 { - // TODO: complete this + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + pRatings := make([]*datastore_types.DataStoreRatingInfo, 0) + pResults := make([]*nex.Result, 0) + + // * Real DataStore does not actually check this. + // * I just didn't feel like working out the + // * logic for differing sized lists. So force + // * them to always be the same + if len(targets) != len(params) { + return nex.Errors.DataStore.InvalidArgument + } + + for i := 0; i < len(targets); i++ { + target := targets[i] + param := params[i] + + rating, errCode := datastore_db.RateObjectWithPassword(target.DataID, target.Slot, param.RatingValue, param.AccessPassword) + if errCode != 0 { + return errCode + } + + if fetchRatings { + pRatings = append(pRatings, rating) + } + } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteUInt32LE(0x00000000) // pRatings List length 0 - rmcResponseStream.WriteUInt32LE(0x00000000) // pResults List length 0 + rmcResponseStream.WriteListStructure(pRatings) + rmcResponseStream.WriteListResult(pResults) // * pResults is always empty rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/add_to_buffer_queues.go b/nex/datastore/super-mario-maker/add_to_buffer_queues.go index b273cd2..2d4ee36 100644 --- a/nex/datastore/super-mario-maker/add_to_buffer_queues.go +++ b/nex/datastore/super-mario-maker/add_to_buffer_queues.go @@ -4,26 +4,59 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) uint32 { - pResults := make([]uint32, 0) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } - for i := 0; i < len(params); i++ { - buffer := buffers[i] + pResults := make([]*nex.Result, 0) + + // * The number of params and buffers CAN be allowed + // * to differ, though this doesn't appear to happen + // * in normal gameplay. In these cases, the real + // * server will just loop over smallest list and + // * ignore all other data in the larger list + iterations := min(len(params), len(buffers)) + + for i := 0; i < iterations; i++ { param := params[i] + buffer := buffers[i] - database.InsertBufferQueueData(param.DataID, param.Slot, buffer) - database.IncrementCourseFailCount(param.DataID) + if param.Slot == 0 { + objectInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID) + if errCode != 0 { + return errCode + } - pResults = append(pResults, 0x690001) + // * Objects with DataType 1 are "maker" objects. When adding + // * a buffer to slot 0 of a maker object, a course is being + // * added to that users "Starred Courses" list. The buffer + // * is the courses DataID saved as an 8 byte buffer. To + // * prevent people from adding courses to random users + // * "Starred Courses" lists, we have to verify the requesting + // * client owns the maker object + if objectInfo.DataType == 1 && objectInfo.OwnerID != client.PID() { + return nex.Errors.DataStore.PermissionDenied + } + } + + errCode := datastore_smm_db.InsertOrUpdateBufferQueueData(param.DataID, param.Slot, buffer) + if errCode != 0 { + return errCode + } + + pResults = append(pResults, nex.NewResultSuccess(nex.Errors.Core.Unknown)) // * Seems to ALWAYS be a success? } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteListUInt32LE(pResults) + rmcResponseStream.WriteListResult(pResults) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go index 5d3e07b..212e003 100644 --- a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go +++ b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go @@ -1,26 +1,31 @@ package nex_datastore_super_mario_maker import ( - "fmt" - nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { - var isBelowThreshold uint8 + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + // * No idea what this is. Only seen application ID 0 + // * used, and it's always true? Unsure what this checks + isBelowThreshold := false switch applicationID { - case 0: // unknown - isBelowThreshold = 1 + case 0: // * Unknown + isBelowThreshold = true default: - fmt.Printf("[Warning] DataStoreSMMProtocol::CheckRateCustomRankingCounter Unsupported applicationID: %v\n", applicationID) + globals.Logger.Warningf("Unsupported applicationID: %d", applicationID) } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteUInt8(isBelowThreshold) + rmcResponseStream.WriteBool(isBelowThreshold) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 4931828..67a9a62 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -8,15 +8,46 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreCompletePostParam *datastore_types.DataStoreCompletePostParam) uint32 { - // TODO: complete this +func CompleteAttachFile(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreCompletePostParam) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + // TODO - What is param.IsSuccess? Is this correct? + if !param.IsSuccess { + return nex.Errors.DataStore.InvalidArgument + } bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.bin", dataStoreCompletePostParam.DataID) - URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) + key := fmt.Sprintf("%d.jpg", param.DataID) + + objectSizeS3, err := globals.S3ObjectSize(bucket, key) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.NotFound + } + + objectSizeDB, errCode := datastore_db.GetObjectSizeDataID(param.DataID) + if errCode != 0 { + return errCode + } + + if objectSizeS3 != uint64(objectSizeDB) { + // TODO - Is this a good error? + return nex.Errors.DataStore.Unknown + } + + errCode = datastore_db.UpdateObjectUploadCompletedByDataID(param.DataID, true) + if errCode != 0 { + return errCode + } + + pURL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.OperationNotAllowed @@ -24,7 +55,7 @@ func CompleteAttachFile(err error, client *nex.Client, callID uint32, dataStoreC rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteString(URL.String()) + rmcResponseStream.WriteString(pURL.String()) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go index e75d446..b1ed747 100644 --- a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go +++ b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go @@ -3,22 +3,35 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" - datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -// This is the same as DataStoreSMM::RecommendedCourseSearchObject -// Not sure why they used a different method here? -func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) uint32 { - pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) +func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } - courseMetadatas := database.GetCourseMetadatasByLimit(100) // In PCAPs param.minimalRatingFrequency is 100 but is 0 here? + // * This method is only used by the 3DS version + // * of Super Mario Maker and is functionally + // * identical to the WiiU versions + // * DataStoreSMM::RecommendedCourseSearchObject + // * method. The 3DS version LIKELY uses this as + // * a way to filter out courses which use the + // * Mystery Mushroom powerup, since it's not + // * officially supported by the 3DS version. That + // * said, the Mystery Mushroom IS still in the + // * game and can be used somewhat normally, so + // * no filtering is done here to prevent that. + // * I'm not even sure how we would detect that - for _, courseMetadata := range courseMetadatas { - pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) + // TODO - Research extraData + // TODO - Use the offet? Real client never uses it, but might be nice for completeness sake? + pRankingResults, errCode := datastore_smm_db.GetRandomCoursesWithLimit(int(param.ResultRange.Length)) + if errCode != 0 { + return errCode } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go index 94d200d..a9d6960 100644 --- a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go +++ b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go @@ -5,19 +5,61 @@ import ( datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) -func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, dataStoreSearchParam *datastore_types.DataStoreSearchParam, extraData []string) uint32 { +func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) - for _, pid := range dataStoreSearchParam.OwnerIDs { - courseMetadatas := database.GetCourseMetadatasByPID(pid) + // * This seems to ONLY be used to get rankings for course objects + // * uploaded by the users in param.OwnerIDs? If param.ResultOption + // * contains the flag 0x20 ("return scores"), then the real server + // * does some kind of check over extraData. It's unknown what this + // * check is, so it's not done here. All other data in param seems + // * to be unused here. + for _, pid := range param.OwnerIDs { + courseObjectIDs, errCode := datastore_smm_db.GetUserCourseObjectIDs(pid) + if errCode != 0 { + return errCode + } - for _, courseMetadata := range courseMetadatas { - pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) + // * This method seems to always use slot 0? + results := datastore_smm_db.GetCustomRankingsByDataIDs(0, courseObjectIDs) + + for _, rankingResult := range results { + // * This is kind of backwards. + // * The database pulls this data + // * by default, so it can be done + // * in a single query. So instead + // * of checking if a flag *IS* + // * set, and conditionally *ADDING* + // * the fields, we check if a flag + // * is *NOT* set and conditionally + // * *REMOVE* the field + if param.ResultOption&0x1 == 0 { + rankingResult.MetaInfo.Tags = make([]string, 0) + } + + if param.ResultOption&0x2 == 0 { + rankingResult.MetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + } + + if param.ResultOption&0x4 == 0 { + rankingResult.MetaInfo.MetaBinary = make([]byte, 0) + } + + // TODO - If this flag is set, extraData is checked somehow + if param.ResultOption&0x20 == 0 { + rankingResult.Score = 0 + } + + pRankingResults = append(pRankingResults, rankingResult) } } diff --git a/nex/datastore/super-mario-maker/get_application_config.go b/nex/datastore/super-mario-maker/get_application_config.go index 5253da3..2c63ed9 100644 --- a/nex/datastore/super-mario-maker/get_application_config.go +++ b/nex/datastore/super-mario-maker/get_application_config.go @@ -8,20 +8,30 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -var MAX_COURSE_UPLOADS uint32 = 0x64 // Nintendo has this set to 100, but we can change it if we want +// * Nintendo sets this to 10 by default +// * and users earn more upload slots up +// * to 100. +// * This is a stupid, unfun, mechanic so +// * everyone gets 100 by default. Can be +// * more, but 100 is fine tbh +var MAX_COURSE_UPLOADS uint32 = 100 func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } config := make([]uint32, 0) switch applicationID { - case 0: // Unknown? - config = getApplicationConfig_Unknown0() - case 1: // Official player PIDs - config = getApplicationConfig_OfficialPlayers() - case 2: // Unknown? + case 0: // * Player config? + config = getApplicationConfig_PlayerConfig() + case 1: // * PIDs of the "Official" makers in the "MAKERS" section + config = getApplicationConfig_OfficialMakers() + case 2: // * Unknown config = getApplicationConfig_Unknown2() - case 10: // Unknown? + case 10: // * Unknown config = getApplicationConfig_Unknown10() default: fmt.Printf("[Warning] DataStoreSMMProtocol::GetApplicationConfig Unsupported applicationID: %v\n", applicationID) @@ -54,9 +64,12 @@ func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicat return 0 } -func getApplicationConfig_Unknown0() []uint32 { - // I have no idea what this is - // Just replaying data sent from the real server +func getApplicationConfig_PlayerConfig() []uint32 { + // * This seems to be per-user configuration + // * settings, based on the fact that the + // * number of max uploads a user can do is + // * sent here. No idea what anything else + // * means return []uint32{ 0x01000000, 0x32000000, 0x96000000, 0x2c010000, 0xf4010000, 0x20030000, 0x14050000, 0xd0070000, 0xb80b0000, 0x88130000, @@ -69,29 +82,30 @@ func getApplicationConfig_Unknown0() []uint32 { } } -func getApplicationConfig_OfficialPlayers() []uint32 { +func getApplicationConfig_OfficialMakers() []uint32 { + // * Used as the PIDs for the "Official" makers in the "MAKERS" section return []uint32{ - 0x02000000, // 2 (not a real user PID, this translates to the internal Quazal Rendez-Vous user used by NEX) - 0x70cc8269, // 1770179696 (official_player0 on NN, need to make PN versions) - 0x50cc8269, // 1770179664 (official_player1 on NN, need to make PN versions) - 0x38cc8269, // 1770179640 (official_player2 on NN, need to make PN versions) - 0xdbd08269, // 1770180827 (official_player3 on NN, need to make PN versions) - 0xa9d08269, // 1770180777 (official_player4 on NN, need to make PN versions) - 0x89d08269, // 1770180745 (official_player5 on NN, need to make PN versions) - 0x59c48269, // 1770177625 (official_player6 on NN, need to make PN versions) - 0x36c48269, // 1770177590 (official_player7 on NN, need to make PN versions) + 0x02000000, // * 2 (not a real user PID, this translates to the internal Quazal Rendez-Vous user used by NEX) + 0x70cc8269, // * 1770179696 (official_player0 on NN, need to make PN versions) + 0x50cc8269, // * 1770179664 (official_player1 on NN, need to make PN versions) + 0x38cc8269, // * 1770179640 (official_player2 on NN, need to make PN versions) + 0xdbd08269, // * 1770180827 (official_player3 on NN, need to make PN versions) + 0xa9d08269, // * 1770180777 (official_player4 on NN, need to make PN versions) + 0x89d08269, // * 1770180745 (official_player5 on NN, need to make PN versions) + 0x59c48269, // * 1770177625 (official_player6 on NN, need to make PN versions) + 0x36c48269, // * 1770177590 (official_player7 on NN, need to make PN versions) } } func getApplicationConfig_Unknown2() []uint32 { - // I have no idea what this is - // Just replaying data sent from the real server + // * I have no idea what this is + // * Just replaying data sent from the real server return []uint32{0xdf070000, 0x0c000000, 0x16000000, 0x05000000, 0x00000000} } func getApplicationConfig_Unknown10() []uint32 { - // I have no idea what this is - // Just replaying data sent from the real server - // Only seen on the 3DS + // * I have no idea what this is + // * Just replaying data sent from the real server + // * Only seen on the 3DS return []uint32{35, 75, 96, 40, 5, 6} } diff --git a/nex/datastore/super-mario-maker/get_application_config_string.go b/nex/datastore/super-mario-maker/get_application_config_string.go index f6d1ff9..908d7cb 100644 --- a/nex/datastore/super-mario-maker/get_application_config_string.go +++ b/nex/datastore/super-mario-maker/get_application_config_string.go @@ -9,7 +9,12 @@ import ( ) func GetApplicationConfigString(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { - // Word blacklists? + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + // * Word blacklists? config := make([]string, 0) switch applicationID { @@ -51,7 +56,8 @@ func GetApplicationConfigString(err error, client *nex.Client, callID uint32, ap } func getApplicationConfigString_WordBlacklist1() []string { - // Just replaying data sent from Nintendo's servers + // * Just replaying data sent from Nintendo's servers + // * Please no cancel for swears/slurs ;-; return []string{ "けされ", "消され", "削除され", "リセットされ", "BANされ", "BANされ", "キミのコース", "君のコース", @@ -74,14 +80,16 @@ func getApplicationConfigString_WordBlacklist1() []string { } func getApplicationConfigString_WordBlacklist2() []string { - // Just replaying data sent from Nintendo's servers + // * Just replaying data sent from Nintendo's servers + // * Please no cancel for swears/slurs ;-; return []string{ "ゼロから", "0から", "0から", "い  い  ね", "いい", "東日本", "大震", } } func getApplicationConfigString_WordBlacklist3() []string { - // Just replaying data sent from Nintendo's servers + // * Just replaying data sent from Nintendo's servers + // * Please no cancel for swears/slurs ;-; return []string{ "いいね", "下さい", "ください", "押して", "おして", "返す", diff --git a/nex/datastore/super-mario-maker/get_buffer_queue.go b/nex/datastore/super-mario-maker/get_buffer_queue.go index 5ed48d7..81bf465 100644 --- a/nex/datastore/super-mario-maker/get_buffer_queue.go +++ b/nex/datastore/super-mario-maker/get_buffer_queue.go @@ -1,31 +1,26 @@ package nex_datastore_super_mario_maker import ( - "fmt" - nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) uint32 { - // TODO: complete this - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - var pBufferQueue [][]byte - - switch param.Slot { - case 0: // unknown - pBufferQueue = make([][]byte, 0) - case 3: // death data - pBufferQueue = database.GetBufferQueueDeathData(param.DataID) - default: - fmt.Printf("[Warning] DataStoreSMMProtocol::GetBufferQueue Unsupported slot: %v\n", param.Slot) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown } + pBufferQueue, errCode := datastore_smm_db.GetBufferQueuesByDataIDAndSlot(param.DataID, param.Slot) + if errCode != 0 { + globals.Logger.Errorf("Error code %d for object %d", errCode, param.DataID) + return errCode + } + + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListQBuffer(pBufferQueue) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/get_course_record.go b/nex/datastore/super-mario-maker/get_course_record.go index ea1f88f..4be4823 100644 --- a/nex/datastore/super-mario-maker/get_course_record.go +++ b/nex/datastore/super-mario-maker/get_course_record.go @@ -4,34 +4,29 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCourseRecordParam) uint32 { - worldRecord := database.GetCourseWorldRecord(param.DataID) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + result, errCode := datastore_smm_db.GetCourseRecordByDataIDAndSlot(param.DataID, param.Slot) + if errCode != 0 { + return errCode + } + + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) + + rmcResponseStream.WriteStructure(result) + + rmcResponseBody := rmcResponseStream.Bytes() rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) - - if worldRecord == nil { - rmcResponse.SetError(nex.Errors.DataStore.NotFound) - } else { - result := datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult() - result.DataID = param.DataID - result.Slot = param.Slot - result.FirstPID = worldRecord.FirstPID - result.BestPID = worldRecord.BestPID - result.BestScore = worldRecord.Score - result.CreatedTime = worldRecord.CreatedTime - result.UpdatedTime = worldRecord.UpdatedTime - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - rmcResponseStream.WriteStructure(result) - - rmcResponseBody := rmcResponseStream.Bytes() - rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetCourseRecord, rmcResponseBody) - } + rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetCourseRecord, rmcResponseBody) rmcResponseBytes := rmcResponse.Bytes() diff --git a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go index ed4c3f8..628b2f1 100644 --- a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go +++ b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go @@ -4,32 +4,56 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) uint32 { - var pRankingResult []*datastore_super_mario_maker_types.DataStoreCustomRankingResult - var pResults []uint32 + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } - switch param.ApplicationID { - case 0: - if len(param.DataIDList) == 0 { // Starred courses - pRankingResult, pResults = getCustomRankingByDataIdStarredCourses(client.PID()) - } else { // Played courses - pRankingResult, pResults = getCustomRankingByDataIdCourseMetadata(param) + pRankingResult := datastore_smm_db.GetCustomRankingsByDataIDs(param.ApplicationID, param.DataIDList) + pResults := make([]*nex.Result, 0, len(param.DataIDList)) + + for _, rankingResult := range pRankingResult { + // * This is kind of backwards. + // * The database pulls this data + // * by default, so it can be done + // * in a single query. So instead + // * of checking if a flag *IS* + // * set, and conditionally *ADDING* + // * the fields, we check if a flag + // * is *NOT* set and conditionally + // * *REMOVE* the field + if param.ResultOption&0x1 == 0 { + rankingResult.MetaInfo.Tags = make([]string, 0) } - case 300000000: // Mii data - pRankingResult, pResults = getCustomRankingByDataIdMiiData(param) - default: // Normal metadata - pRankingResult, pResults = getCustomRankingByDataIdCourseMetadata(param) + + if param.ResultOption&0x2 == 0 { + rankingResult.MetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + } + + if param.ResultOption&0x4 == 0 { + rankingResult.MetaInfo.MetaBinary = make([]byte, 0) + } + + if param.ResultOption&0x20 == 0 { + rankingResult.Score = 0 + } + + // * Since all errors are thrown away in + // * datastore_smm_db.GetCustomRankingsByDataIDs + // * assume all objects returned were a success + pResults = append(pResults, nex.NewResultSuccess(nex.Errors.Core.Unknown)) } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) rmcResponseStream.WriteListStructure(pRankingResult) - rmcResponseStream.WriteListUInt32LE(pResults) + rmcResponseStream.WriteListResult(pResults) rmcResponseBody := rmcResponseStream.Bytes() @@ -53,48 +77,3 @@ func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, para return 0 } - -func getCustomRankingByDataIdStarredCourses(pid uint32) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { - courseMetadatas := database.GetUserStarredCourses(pid) - - pRankingResult := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) - pResults := make([]uint32, 0) - - for _, courseMetadata := range courseMetadatas { - pRankingResult = append(pRankingResult, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) - pResults = append(pResults, 0x690001) - } - - return pRankingResult, pResults -} - -func getCustomRankingByDataIdMiiData(param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { - pRankingResult := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) - pResults := make([]uint32, 0) - - for _, pid := range param.DataIDList { - pid := uint32(pid) - miiInfo := database.GetUserMiiInfoByPID(pid) // This isn't actually a PID when using the official servers! I set it as one to make this easier for me - - if miiInfo != nil { - pRankingResult = append(pRankingResult, utility.UserMiiDataToDataStoreCustomRankingResult(pid, miiInfo)) - pResults = append(pResults, 0x690001) - } - } - - return pRankingResult, pResults -} - -func getCustomRankingByDataIdCourseMetadata(param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) ([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, []uint32) { - courseMetadatas := database.GetCourseMetadataByDataIDs(param.DataIDList) - - pRankingResult := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) - pResults := make([]uint32, 0) - - for _, courseMetadata := range courseMetadatas { - pRankingResult = append(pRankingResult, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) - pResults = append(pResults, 0x690001) - } - - return pRankingResult, pResults -} diff --git a/nex/datastore/super-mario-maker/get_deletion_reason.go b/nex/datastore/super-mario-maker/get_deletion_reason.go index 429f7d0..9e52992 100644 --- a/nex/datastore/super-mario-maker/get_deletion_reason.go +++ b/nex/datastore/super-mario-maker/get_deletion_reason.go @@ -6,15 +6,24 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIdLst []uint64) uint32 { - // TODO: Complete this +func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIDLst []uint64) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + // TODO - Complete this + // * It's not actually known what the + // * real "deletion reason" values are. + // * This is stubbed until we figure + // * that out pDeletionReasons := make([]uint32, 0) - for range dataIdLst { - // We don't need the values right now - // stub this - pDeletionReasons = append(pDeletionReasons, 0x690007) + for range dataIDLst { + // * Every course I've checked has had this + // * set to 0, even if the course is not + // * deleted + pDeletionReasons = append(pDeletionReasons, 0) } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/datastore/super-mario-maker/get_metas_with_course_record.go b/nex/datastore/super-mario-maker/get_metas_with_course_record.go index fb2ad6d..6bf6ef4 100644 --- a/nex/datastore/super-mario-maker/get_metas_with_course_record.go +++ b/nex/datastore/super-mario-maker/get_metas_with_course_record.go @@ -5,17 +5,135 @@ import ( datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, dataStoreGetCourseRecordParams []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, dataStoreGetMetaParam *datastore_types.DataStoreGetMetaParam) uint32 { - // TODO: complete this +func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, metaParam *datastore_types.DataStoreGetMetaParam) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + // * The functionality here is largely a guess + // * based on how GetCourseRecord works and + // * based on testing with a custom client. + // * During normal gameplay this method never + // * seems to send any parameters, though if a + // * custom client is used it IS functional + + pMetaInfo := make([]*datastore_types.DataStoreMetaInfo, 0, len(params)) + pCourseResults := make([]*datastore_super_mario_maker_types.DataStoreGetCourseRecordResult, 0, len(params)) + pResults := make([]*nex.Result, 0, len(params)) + + for _, param := range params { + // * metaParam has a password, but it's always set to 0. + // * It also wouldn't make much sense for the same password + // * to be used for all objects being requested here. So + // * just assume metaParam is ONLY used for the resultOption + // * field? + objectInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID) + if errCode != 0 { + // TODO - Maybe this should be broken out into a util function in globals? + objectInfo = datastore_types.NewDataStoreMetaInfo() + objectInfo.DataID = 0 + objectInfo.OwnerID = 0 + objectInfo.Size = 0 + objectInfo.Name = "" + objectInfo.DataType = 0 + objectInfo.MetaBinary = []byte{} + objectInfo.Permission = datastore_types.NewDataStorePermission() + objectInfo.Permission.Permission = 0 + objectInfo.Permission.RecipientIDs = []uint32{} + objectInfo.DelPermission = datastore_types.NewDataStorePermission() + objectInfo.DelPermission.Permission = 0 + objectInfo.DelPermission.RecipientIDs = []uint32{} + objectInfo.CreatedTime = nex.NewDateTime(0) + objectInfo.UpdatedTime = nex.NewDateTime(0) + objectInfo.Period = 0 + objectInfo.Status = 0 + objectInfo.ReferredCnt = 0 + objectInfo.ReferDataID = 0 + objectInfo.Flag = 0 + objectInfo.ReferredTime = nex.NewDateTime(0) + objectInfo.ExpireTime = nex.NewDateTime(0) + objectInfo.Tags = []string{} + objectInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} + } else { + errCode = globals.VerifyObjectPermission(objectInfo.OwnerID, client.PID(), objectInfo.Permission) + if errCode != 0 { + objectInfo = datastore_types.NewDataStoreMetaInfo() + objectInfo.DataID = 0 + objectInfo.OwnerID = 0 + objectInfo.Size = 0 + objectInfo.Name = "" + objectInfo.DataType = 0 + objectInfo.MetaBinary = []byte{} + objectInfo.Permission = datastore_types.NewDataStorePermission() + objectInfo.Permission.Permission = 0 + objectInfo.Permission.RecipientIDs = []uint32{} + objectInfo.DelPermission = datastore_types.NewDataStorePermission() + objectInfo.DelPermission.Permission = 0 + objectInfo.DelPermission.RecipientIDs = []uint32{} + objectInfo.CreatedTime = nex.NewDateTime(0) + objectInfo.UpdatedTime = nex.NewDateTime(0) + objectInfo.Period = 0 + objectInfo.Status = 0 + objectInfo.ReferredCnt = 0 + objectInfo.ReferDataID = 0 + objectInfo.Flag = 0 + objectInfo.ReferredTime = nex.NewDateTime(0) + objectInfo.ExpireTime = nex.NewDateTime(0) + objectInfo.Tags = []string{} + objectInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} + } + + // * This is kind of backwards. + // * The database pulls this data + // * by default, so it can be done + // * in a single query. So instead + // * of checking if a flag *IS* + // * set, and conditionally *ADDING* + // * the fields, we check if a flag + // * is *NOT* set and conditionally + // * *REMOVE* the field + if metaParam.ResultOption&0x1 == 0 { + objectInfo.Tags = make([]string, 0) + } + + if metaParam.ResultOption&0x2 == 0 { + objectInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) + } + + if metaParam.ResultOption&0x4 == 0 { + objectInfo.MetaBinary = make([]byte, 0) + } + } + + // * Ignore errors, real server sends empty struct if can't be found + courseRecord, errCode := datastore_smm_db.GetCourseRecordByDataIDAndSlot(param.DataID, param.Slot) + if errCode != 0 || objectInfo.DataID == 0 { // * DataID == 0 means could not be found or accessed + courseRecord = datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult() + courseRecord.DataID = 0 + courseRecord.Slot = 0 + courseRecord.FirstPID = 0 + courseRecord.BestPID = 0 + courseRecord.BestScore = 0 + courseRecord.CreatedTime = nex.NewDateTime(0) + courseRecord.UpdatedTime = nex.NewDateTime(0) + } + + pMetaInfo = append(pMetaInfo, objectInfo) + pCourseResults = append(pCourseResults, courseRecord) + pResults = append(pResults, nex.NewResultSuccess(nex.Errors.Core.Unknown)) // * Real server ALWAYS returns a success + } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteUInt32LE(0x00000000) // pMetaInfo List length 0 - rmcResponseStream.WriteUInt32LE(0x00000000) // pCourseResults List length 0 - rmcResponseStream.WriteUInt32LE(0x00000000) // pResults List length 0 + rmcResponseStream.WriteListStructure(pMetaInfo) + rmcResponseStream.WriteListStructure(pCourseResults) + rmcResponseStream.WriteListResult(pResults) rmcResponseBody := rmcResponseStream.Bytes() diff --git a/nex/datastore/super-mario-maker/get_object_infos.go b/nex/datastore/super-mario-maker/get_object_infos.go index 3a2e351..de1b98d 100644 --- a/nex/datastore/super-mario-maker/get_object_infos.go +++ b/nex/datastore/super-mario-maker/get_object_infos.go @@ -9,18 +9,26 @@ import ( datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint64) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + pInfos := make([]*datastore_super_mario_maker_types.DataStoreFileServerObjectInfo, 0) - courseMetadatas := database.GetCourseMetadataByDataIDs(dataIDs) + for _, dataID := range dataIDs { + objectInfo, errCode := datastore_db.GetObjectInfoByDataID(dataID) + if errCode != 0 { + return errCode + } - for _, courseMetadata := range courseMetadatas { bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.bin", courseMetadata.DataID) + key := fmt.Sprintf("%d.bin", objectInfo.DataID) URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) if err != nil { @@ -29,13 +37,13 @@ func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint } info := datastore_super_mario_maker_types.NewDataStoreFileServerObjectInfo() - info.DataID = courseMetadata.DataID + info.DataID = objectInfo.DataID info.GetInfo = datastore_types.NewDataStoreReqGetInfo() info.GetInfo.URL = URL.String() info.GetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - info.GetInfo.Size = courseMetadata.Size + info.GetInfo.Size = objectInfo.Size info.GetInfo.RootCACert = []byte{} - info.GetInfo.DataID = courseMetadata.DataID + info.GetInfo.DataID = objectInfo.DataID pInfos = append(pInfos, info) } diff --git a/nex/datastore/super-mario-maker/prepare_attach_file.go b/nex/datastore/super-mario-maker/prepare_attach_file.go index 924acba..a84f5e3 100644 --- a/nex/datastore/super-mario-maker/prepare_attach_file.go +++ b/nex/datastore/super-mario-maker/prepare_attach_file.go @@ -9,14 +9,45 @@ import ( datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func PrepareAttachFile(err error, client *nex.Client, callID uint32, dataStoreAttachFileParam *datastore_super_mario_maker_types.DataStoreAttachFileParam) uint32 { - dataID := dataStoreAttachFileParam.ReferDataID - bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.jpeg", dataID) +func PrepareAttachFile(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreAttachFileParam) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + // * This method seems to be only used at "attach" + // * a file to an existing object. In practice, + // * SMM will use this to upload a courses preview + // * image after uploading the course. + // * param.ReferDataID is the courses object DataID + + dataID, errCode := datastore_smm_db.InitializeObjectByAttachFileParam(client.PID(), param) + if errCode != 0 { + globals.Logger.Errorf("Error code %d on object init", errCode) + return errCode + } + + // TODO - Should this be moved to InitializeObjectByAttachFileParam? + // * This never seems to have any values during normal gameplay, + // * but just in case + for _, ratingInitParamWithSlot := range param.PostParam.RatingInitParams { + errCode = datastore_db.InitializeObjectRatingWithSlot(dataID, ratingInitParamWithSlot) + if errCode != 0 { + globals.Logger.Errorf("Error code %d on rating init", errCode) + return errCode + } + } + + // TODO - Check param.ContentType? Always seems to be "image/jpeg" but just in case? + bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") + key := fmt.Sprintf("%d.jpg", dataID) + + // TODO - Should this also take in the param.ContentType? To add it to the policy? URL, formData, _ := globals.Presigner.PostObject(bucket, key, time.Minute*15) pReqPostInfo := datastore_types.NewDataStoreReqPostInfo() diff --git a/nex/datastore/super-mario-maker/rate_custom_ranking.go b/nex/datastore/super-mario-maker/rate_custom_ranking.go index 4f97db8..0b0c895 100644 --- a/nex/datastore/super-mario-maker/rate_custom_ranking.go +++ b/nex/datastore/super-mario-maker/rate_custom_ranking.go @@ -4,92 +4,19 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) uint32 { - - /* - This has to change. We need to figure out what DataStoreRateCustomRankingParam.applicationId means. - This method sends a set number of DataStoreRateCustomRankingParam's in the params list depending - on what action the user does. - - - Course upload: 4 params - - DataStoreRateCustomRankingParam.dataId is always the course ID - - DataStoreRateCustomRankingParam.score is always 0 - - DataStoreRateCustomRankingParam.period is always 36500 - - DataStoreRateCustomRankingParam.applicationId is: - - 0 (seen in other requests relating to Mii data?) - - 2400 - - 200000000 - - 200002400 - - - Course clear: 2 params - - DataStoreRateCustomRankingParam.dataId is always the course ID - - DataStoreRateCustomRankingParam.score is always 1 - - DataStoreRateCustomRankingParam.period is always 36500 - - DataStoreRateCustomRankingParam.applicationId is: - - 200000000 - - 200002400 - - - Course star: 12 params - - DataStoreRateCustomRankingParam.dataId is: - - course ID - - course ID - - course ID - - course ID - - course ID - - course ID - - uploader PID - - uploader PID - - uploader PID - - uploader PID - - uploader PID - - uploader PID - - DataStoreRateCustomRankingParam.score is always 1 - - DataStoreRateCustomRankingParam.period is: - - 36500 - - 36500 - - 1 - - 1 - - 1 - - 1 - - 36500 - - 36500 - - 1 - - 1 - - 1 - - 1 - - DataStoreRateCustomRankingParam.applicationId is: - - 0 (seen in other requests relating to Mii data?) - - 2400 - - 119700101 - - 119702501 - - 1497730516 - - 1497732916 - - 300000000 (seen in other requests relating to Mii data?) - - 300002400 - - 419700101 - - 419702501 - - 1797730516 - - 1797732916 - - It seems like many applicationId's are actually a different ID with 2400 added to it? - - Since it always sends a set number of params per action, a quick and dirty way to tell them apart is - to check the param list length. However this should NOT be relied on forever and we NEED to learn more - about applicationId, as it IS used in many other requests - */ - - if len(params) == 2 { - // assume "course clear" action - database.IncrementCourseClearCount(params[0].DataID) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown } - if len(params) == 12 { - // assume "star course" action - database.IncrementCourseStarCount(params[0].DataID) + // TODO - Check the period. The real server does check this, just unsure what it means or what the check is + for _, param := range params { + datastore_smm_db.InsertOrUpdateCustomRanking(param.DataID, param.ApplicationID, param.Score) } rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) diff --git a/nex/datastore/super-mario-maker/recommended_course_search_object.go b/nex/datastore/super-mario-maker/recommended_course_search_object.go index dda2926..195cbec 100644 --- a/nex/datastore/super-mario-maker/recommended_course_search_object.go +++ b/nex/datastore/super-mario-maker/recommended_course_search_object.go @@ -3,28 +3,41 @@ package nex_datastore_super_mario_maker import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" - datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { - // TODO: complete this + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } - pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) + // * This method is used in 100 Mario and Course World + // * + // * extraData seems to be a set of filters defining a + // * range for a courses success rate + // * + // * Course World (All) ["", "", "", "0", "0"] + // * Course World (Easy) ["1", "0", "34", "0", "0"] + // * Course World (Normal) ["1", "35", "74", "0", "0"] + // * Course World (Expert) ["1", "75", "95", "0", "0"] + // * Course World (Super Expert) ["1", "96", "100", "0", "0"] + // * + // * Indexes 1 and 2 seem to be a min and max for the *failure* + // * rate of the courses. This is not taken into account yet, + // * as the SQL query for this would need to be rather complex. + // * The last 2 values always seem to be 0, and the first seems + // * to always be 1 besides filtering for "All" + // * + // ! All requests are treated as filtering for "All" right now + // TODO - Use these ranges to properly filter by difficulty - // TEMP FOR SHUTTER TO TEST THINGS - if client.PID() == 1049991375 { - courseMetadata := database.GetCourseMetadataByDataID(145) // specific course shutter wants - pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) - } else { - courseMetadatas := database.GetCourseMetadatasByLimit(100) // In PCAPs param.minimalRatingFrequency is 100 but is 0 here? - - for _, courseMetadata := range courseMetadatas { - pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) - } + // TODO - Use the offet? Real client never uses it, but might be nice for completeness sake? + pRankingResults, errCode := datastore_smm_db.GetRandomCoursesWithLimit(int(param.ResultRange.Length)) + if errCode != 0 { + return errCode } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/datastore/super-mario-maker/suggested_course_search_object.go b/nex/datastore/super-mario-maker/suggested_course_search_object.go index d29a5d1..1b85005 100644 --- a/nex/datastore/super-mario-maker/suggested_course_search_object.go +++ b/nex/datastore/super-mario-maker/suggested_course_search_object.go @@ -5,28 +5,37 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" - datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/utility" ) func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { - // TODO: complete this - - courseID, _ := strconv.ParseUint(extraData[0], 0, 64) - - if utility.UserNotOwnCourse(courseID, client.PID()) { - database.IncrementCourseAttemptCount(courseID) // We also know this is when a user attempts a course + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown } - pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) + // * This method is called when a course is completed + // * to show the scrolling courses at the bottom of the + // * screen. extraData[0] is the DataID of the current + // * course. extraData[1] and extraData[2] are usually + // * 2 and 6 respectively. extraData[3] and extraData[4] + // * are always 0? extraData seems to not have any + // * effect on the NUMBER of courses returned but likely + // * does act as a filter of some kind? Maybe it has to + // * do with difficulty? Or ratings? - courseMetadatas := database.GetCourseMetadatasByLimit(4) // In PCAPs param.minimalRatingFrequency is 4 but is 0 here? + _, err = strconv.ParseUint(extraData[0], 0, 64) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.InvalidArgument + } - for _, courseMetadata := range courseMetadatas { - pRankingResults = append(pRankingResults, utility.CourseMetadataToDataStoreCustomRankingResult(courseMetadata)) + // TODO - Use extraData for filtering + pRankingResults, errCode := datastore_smm_db.GetRandomCoursesWithLimit(int(param.ResultRange.Length)) + if errCode != 0 { + return errCode } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/datastore/super-mario-maker/upload_course_record.go b/nex/datastore/super-mario-maker/upload_course_record.go index 65806f5..40aa1fa 100644 --- a/nex/datastore/super-mario-maker/upload_course_record.go +++ b/nex/datastore/super-mario-maker/upload_course_record.go @@ -4,12 +4,20 @@ import ( nex "github.com/PretendoNetwork/nex-go" datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" + datastore_smm_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore/super-mario-maker" "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreUploadCourseRecordParam) uint32 { - database.UpdateCourseWorldRecord(param.DataID, client.PID(), param.Score) + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + errCode := datastore_smm_db.InsertOrUpdateCourseRecord(param.DataID, param.Slot, client.PID(), param.Score) + if errCode != 0 { + return errCode + } rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID) rmcResponse.SetSuccess(datastore_super_mario_maker.MethodUploadCourseRecord, nil) diff --git a/nex/message-delivery/deliver_message.go b/nex/message-delivery/deliver_message.go index c66e87a..66c7b8f 100644 --- a/nex/message-delivery/deliver_message.go +++ b/nex/message-delivery/deliver_message.go @@ -7,6 +7,13 @@ import ( ) func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage *nex.DataHolder) uint32 { + if err != nil { + globals.Logger.Error(err.Error()) + return nex.Errors.DataStore.Unknown + } + + // TODO - See what this does + rmcResponse := nex.NewRMCResponse(message_delivery.ProtocolID, callID) rmcResponse.SetSuccess(message_delivery.MethodDeliverMessage, nil) diff --git a/types/course_metadata.go b/types/course_metadata.go deleted file mode 100644 index ad249b7..0000000 --- a/types/course_metadata.go +++ /dev/null @@ -1,20 +0,0 @@ -package types - -import "github.com/PretendoNetwork/nex-go" - -type CourseMetadata struct { - DataID uint64 - OwnerPID uint32 - Size uint32 - CreatedTime *nex.DateTime - UpdatedTime *nex.DateTime - Name string - MetaBinary []byte - Stars uint32 - Attempts uint32 - Failures uint32 - Completions uint32 - Flag uint32 - DataType uint16 - Period uint16 -} diff --git a/types/course_world_record.go b/types/course_world_record.go deleted file mode 100644 index 617e795..0000000 --- a/types/course_world_record.go +++ /dev/null @@ -1,11 +0,0 @@ -package types - -import "github.com/PretendoNetwork/nex-go" - -type CourseWorldRecord struct { - FirstPID uint32 - BestPID uint32 - CreatedTime *nex.DateTime - UpdatedTime *nex.DateTime - Score int32 -} diff --git a/utility/utility.go b/utility/utility.go deleted file mode 100644 index 918873a..0000000 --- a/utility/utility.go +++ /dev/null @@ -1,195 +0,0 @@ -package utility - -import ( - "context" - "encoding/base64" - "time" - - pb "github.com/PretendoNetwork/grpc-go/account" - "github.com/PretendoNetwork/nex-go" - datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker/types" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - "github.com/PretendoNetwork/super-mario-maker-secure/database" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" - "github.com/PretendoNetwork/super-mario-maker-secure/types" - "github.com/minio/minio-go/v7" -) - -func CourseMetadataToDataStoreCustomRankingResult(courseMetadata *types.CourseMetadata) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { - rankingResult := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() - - rankingResult.Order = 0 // unknown - rankingResult.Score = courseMetadata.Stars - rankingResult.MetaInfo = CourseMetadataToDataStoreMetaInfo(courseMetadata) - - return rankingResult -} - -func CourseMetadataToDataStoreMetaInfo(courseMetadata *types.CourseMetadata) *datastore_types.DataStoreMetaInfo { - metaInfo := datastore_types.NewDataStoreMetaInfo() - - metaInfo.DataID = courseMetadata.DataID - metaInfo.OwnerID = courseMetadata.OwnerPID - metaInfo.Size = courseMetadata.Size - metaInfo.Name = courseMetadata.Name - metaInfo.DataType = courseMetadata.DataType - metaInfo.MetaBinary = courseMetadata.MetaBinary - metaInfo.Permission = datastore_types.NewDataStorePermission() - metaInfo.Permission.Permission = 0 // unknown - metaInfo.Permission.RecipientIDs = []uint32{} - metaInfo.DelPermission = datastore_types.NewDataStorePermission() - metaInfo.DelPermission.Permission = 3 // unknown - metaInfo.DelPermission.RecipientIDs = []uint32{} - metaInfo.CreatedTime = courseMetadata.CreatedTime - metaInfo.UpdatedTime = courseMetadata.UpdatedTime - metaInfo.Period = courseMetadata.Period - metaInfo.Status = 0 // unknown - metaInfo.ReferredCnt = 0 // unknown - metaInfo.ReferDataID = 0 // unknown - metaInfo.Flag = courseMetadata.Flag - metaInfo.ReferredTime = courseMetadata.CreatedTime - metaInfo.ExpireTime = nex.NewDateTime(671075926016) // December 31st, year 9999 - metaInfo.Tags = []string{""} // unknown - metaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{ - datastore_types.NewDataStoreRatingInfoWithSlot(), // attempts - datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown - datastore_types.NewDataStoreRatingInfoWithSlot(), // completions - datastore_types.NewDataStoreRatingInfoWithSlot(), // failures - datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown - datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown - datastore_types.NewDataStoreRatingInfoWithSlot(), // unknown - } - - // attempts - metaInfo.Ratings[0].Slot = 0 - metaInfo.Ratings[0].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[0].Rating.TotalValue = int64(courseMetadata.Attempts) - metaInfo.Ratings[0].Rating.Count = courseMetadata.Attempts - metaInfo.Ratings[0].Rating.InitialValue = 0 - - // unknown - metaInfo.Ratings[1].Slot = 1 - metaInfo.Ratings[1].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[1].Rating.TotalValue = 2 - metaInfo.Ratings[1].Rating.Count = 2 - metaInfo.Ratings[1].Rating.InitialValue = 0 - - // completions - metaInfo.Ratings[2].Slot = 2 - metaInfo.Ratings[2].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[2].Rating.TotalValue = int64(courseMetadata.Completions) - metaInfo.Ratings[2].Rating.Count = courseMetadata.Completions - metaInfo.Ratings[2].Rating.InitialValue = 0 - - // failures - metaInfo.Ratings[3].Slot = 3 - metaInfo.Ratings[3].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[3].Rating.TotalValue = int64(courseMetadata.Failures) - metaInfo.Ratings[3].Rating.Count = courseMetadata.Failures - metaInfo.Ratings[3].Rating.InitialValue = 0 - - // unknown - metaInfo.Ratings[4].Slot = 4 - metaInfo.Ratings[4].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[4].Rating.TotalValue = 5 - metaInfo.Ratings[4].Rating.Count = 5 - metaInfo.Ratings[4].Rating.InitialValue = 0 - - // unknown - metaInfo.Ratings[5].Slot = 5 - metaInfo.Ratings[5].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[5].Rating.TotalValue = 6 - metaInfo.Ratings[5].Rating.Count = 6 - metaInfo.Ratings[5].Rating.InitialValue = 0 - - // Number of new Miiverse comments - metaInfo.Ratings[6].Slot = 6 - metaInfo.Ratings[6].Rating = datastore_types.NewDataStoreRatingInfo() - metaInfo.Ratings[6].Rating.TotalValue = 0 - metaInfo.Ratings[6].Rating.Count = 0 - metaInfo.Ratings[6].Rating.InitialValue = 0 - - return metaInfo -} - -func UserMiiDataToDataStoreCustomRankingResult(ownerID uint32, miiInfo *pb.Mii) *datastore_super_mario_maker_types.DataStoreCustomRankingResult { - rankingResult := datastore_super_mario_maker_types.NewDataStoreCustomRankingResult() - - rankingResult.Order = 0 - rankingResult.Score = 0 - rankingResult.MetaInfo = UserMiiDataToDataStoreMetaInfo(ownerID, miiInfo) - - return rankingResult -} - -func UserMiiDataToDataStoreMetaInfo(ownerID uint32, miiInfo *pb.Mii) *datastore_types.DataStoreMetaInfo { - encodedMiiData := miiInfo.Data - decodedMiiData, _ := base64.StdEncoding.DecodeString(encodedMiiData) - - metaBinaryStream := nex.NewStreamOut(globals.SecureServer) - metaBinaryStream.Grow(140) - metaBinaryStream.WriteBytesNext([]byte{ - 0x42, 0x50, 0x46, 0x43, // BPFC magic - 0x00, 0x00, 0x00, 0x01, // Unknown - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x01, 0x00, 0x00, // Unknown - }) - metaBinaryStream.WriteBytesNext(decodedMiiData) // Actual Mii data - metaBinaryStream.WriteBytesNext([]byte{ - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x00, 0x00, 0x00, // Unknown - 0x00, 0x00, 0x00, 0x01, // Unknown - }) - - now := uint64(time.Now().Unix()) - - metaInfo := datastore_types.NewDataStoreMetaInfo() - metaInfo.DataID = uint64(ownerID) // This isn;t actually a user PID in Nintendo's servers, but it makes it much easier for us to do it this way - metaInfo.OwnerID = ownerID - metaInfo.Size = 0 - metaInfo.Name = miiInfo.Name - metaInfo.DataType = 1 // Mii data type? - metaInfo.MetaBinary = metaBinaryStream.Bytes() - metaInfo.Permission = datastore_types.NewDataStorePermission() - metaInfo.Permission.Permission = 0 // idk? - metaInfo.Permission.RecipientIDs = []uint32{} - metaInfo.DelPermission = datastore_types.NewDataStorePermission() - metaInfo.DelPermission.Permission = 3 // idk? - metaInfo.DelPermission.RecipientIDs = []uint32{} - metaInfo.CreatedTime = nex.NewDateTime(now) - metaInfo.UpdatedTime = nex.NewDateTime(now) - metaInfo.Period = 90 // idk? - metaInfo.Status = 0 - metaInfo.ReferredCnt = 0 - metaInfo.ReferDataID = 0 - metaInfo.Flag = 256 // idk? - metaInfo.ReferredTime = nex.NewDateTime(now) - metaInfo.ExpireTime = nex.NewDateTime(now) - metaInfo.Tags = []string{"49"} // idk? - metaInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} - - return metaInfo -} - -func UserNotOwnCourse(courseID uint64, pid uint32) bool { - courseMetadata := database.GetCourseMetadataByDataID(courseID) - - return courseMetadata.OwnerPID != pid -} - -func S3StatObject(bucket, key string) (minio.ObjectInfo, error) { - return globals.MinIOClient.StatObject(context.TODO(), bucket, key, minio.StatObjectOptions{}) -} - -func S3ObjectSize(bucket, key string) (uint64, error) { - info, err := S3StatObject(bucket, key) - if err != nil { - return 0, err - } - - return uint64(info.Size), nil -} From a61404decc59596a5ea501a29f892fc7889d9d5c Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sun, 29 Oct 2023 00:57:53 -0400 Subject: [PATCH 23/28] update pResults success code in GetMetasMultipleParam --- nex/datastore/get_metas_multiple_param.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nex/datastore/get_metas_multiple_param.go b/nex/datastore/get_metas_multiple_param.go index 899ffb8..619c649 100644 --- a/nex/datastore/get_metas_multiple_param.go +++ b/nex/datastore/get_metas_multiple_param.go @@ -87,7 +87,7 @@ func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params pResults = append(pResults, nex.NewResultError(errCode)) } else { - pResults = append(pResults, nex.NewResultSuccess(nex.Errors.Core.Unknown)) + pResults = append(pResults, nex.NewResultSuccess(nex.Errors.DataStore.Unknown)) } // * This is kind of backwards. From 84c7bbb36ea9ca37bf9e04c3c1a71a3269b75550 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sun, 29 Oct 2023 00:59:34 -0400 Subject: [PATCH 24/28] updated flags check in ChangeMeta --- nex/datastore/change_meta.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nex/datastore/change_meta.go b/nex/datastore/change_meta.go index 15741fe..bd48473 100644 --- a/nex/datastore/change_meta.go +++ b/nex/datastore/change_meta.go @@ -26,21 +26,21 @@ func ChangeMeta(err error, client *nex.Client, callID uint32, param *datastore_t } // TODO - Refactor this into a single query. Use a query builder like goqu? - if param.ModifiesFlag&0x08 == 0x08 { + if param.ModifiesFlag&0x08 != 0 { errCode = datastore_db.UpdateObjectPeriodByDataIDWithPassword(param.DataID, param.Period, param.UpdatePassword) if errCode != 0 { return errCode } } - if param.ModifiesFlag&0x10 == 0x10 { + if param.ModifiesFlag&0x10 != 0 { errCode = datastore_db.UpdateObjectMetaBinaryByDataIDWithPassword(param.DataID, param.MetaBinary, param.UpdatePassword) if errCode != 0 { return errCode } } - if param.ModifiesFlag&0x80 == 0x80 { + if param.ModifiesFlag&0x80 != 0 { errCode = datastore_db.UpdateObjectDataTypeByDataIDWithPassword(param.DataID, param.DataType, param.UpdatePassword) if errCode != 0 { return errCode From 6aad1b475dbf3b26702b1bc08ce32ae0e64d4fc1 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sun, 29 Oct 2023 01:00:39 -0400 Subject: [PATCH 25/28] fixed datastore_smm_db.GetCustomRankingsByDataIDs not returning all results --- .../get_custom_rankings_by_data_ids.go | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go b/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go index 9d585c9..40b67f0 100644 --- a/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go +++ b/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go @@ -19,12 +19,24 @@ func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datas // * away here and not sent back to the client results := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0, len(dataIDs)) - rows, err := database.Postgres.Query(`SELECT - data_id, - value - FROM datastore.object_custom_rankings WHERE application_id=$1 AND data_id=ANY($2)`, - applicationID, + // * Using UNNEST and WITH ORDINALITY because the input + // * array may contain duplicate DataIDs. These duplicate + // * DataIDs should result in duplicate results, and this + // * was the most efficient way to do this as it doesn't + // * involve processing all rows or manually duplicating + // * rows + rows, err := database.Postgres.Query(` + SELECT + rankings.data_id, + rankings.value + FROM datastore.object_custom_rankings rankings + JOIN UNNEST($1::bigint[]) + WITH ORDINALITY AS rows(data_id, ord) + ON rankings.data_id = rows.data_id + AND rankings.application_id = $2 + ORDER BY rows.ord`, pq.Array(dataIDs), + applicationID, ) // * No rows is allowed @@ -60,5 +72,35 @@ func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datas results = append(results, result) } + /* + itemList := []int{1, 3, 2, 3, 2, 1} + data := []map[string]int{ + {"id": 1}, + {"id": 3}, + {"id": 2}, + } + + itemMap := map[int]map[string]int{} + for _, v := range data { + itemMap[v["id"]] = map[string]int{ + "id": v["id"], + } + } + + output := []map[string]int{} + for _, v := range itemList { + output = append(output, itemMap[v]) + } + + fmt.Println(itemMap) // map[1:map[id:1] 2:map[id:2] 3:map[id:3]] + fmt.Println(output) // [map[id:1] map[id:3] map[id:2] map[id:3] map[id:2] map[id:1]] + */ + // * This is done because the SQL query will remove duplicates, + // * meaning if a DataID is present more than once in the input + // * it will only appear once in the output. This is wrong, all + // * inputs, including duplicates, should appear in the output. + // * + // * This will create a map of all + return results } From d6c5c3b33db396bcb54a6fc584f6a0f86cc15fa8 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sun, 29 Oct 2023 01:01:40 -0400 Subject: [PATCH 26/28] fixed object period and data type update functions being swapped --- .../update_object_data_type_by_data_id_with_password.go | 2 +- .../datastore/update_object_period_by_data_id_with_password.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/database/datastore/update_object_data_type_by_data_id_with_password.go b/database/datastore/update_object_data_type_by_data_id_with_password.go index 1f19124..a280905 100644 --- a/database/datastore/update_object_data_type_by_data_id_with_password.go +++ b/database/datastore/update_object_data_type_by_data_id_with_password.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func UpdateObjectPeriodByDataIDWithPassword(dataID uint64, dataType uint16, password uint64) uint32 { +func UpdateObjectDataTypeByDataIDWithPassword(dataID uint64, dataType uint16, password uint64) uint32 { var updatePassword uint64 var underReview bool diff --git a/database/datastore/update_object_period_by_data_id_with_password.go b/database/datastore/update_object_period_by_data_id_with_password.go index cfd6219..3b83311 100644 --- a/database/datastore/update_object_period_by_data_id_with_password.go +++ b/database/datastore/update_object_period_by_data_id_with_password.go @@ -8,7 +8,7 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func UpdateObjectDataTypeByDataIDWithPassword(dataID uint64, period uint16, password uint64) uint32 { +func UpdateObjectPeriodByDataIDWithPassword(dataID uint64, period uint16, password uint64) uint32 { var updatePassword uint64 var underReview bool From 7f132403afc29423936d9b7f41abff51a552ea08 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Wed, 1 Nov 2023 09:20:14 -0400 Subject: [PATCH 27/28] migrate to common and update README --- README.md | 69 ++++++++- .../datastore/delete_object_by_data_id.go | 23 +++ .../datastore/get_object_owner_by_data_id.go | 26 ++++ .../get_user_course_object_ids.go | 1 - go.mod | 6 +- go.sum | 12 +- nex/authentication.go | 2 +- nex/datastore/change_meta.go | 69 --------- nex/datastore/complete_post_object.go | 66 -------- nex/datastore/get_meta.go | 81 ---------- nex/datastore/get_metas_multiple_param.go | 144 ------------------ nex/datastore/prepare_get_object.go | 73 --------- nex/datastore/prepare_post_object.go | 82 ---------- nex/datastore/rate_objects.go | 68 --------- .../super-mario-maker/add_to_buffer_queues.go | 4 +- .../check_rate_custom_ranking_counter.go | 4 +- .../super-mario-maker/complete_attach_file.go | 4 +- .../ctr_pick_up_course_search_object.go | 4 +- .../followings_latest_course_search_object.go | 4 +- .../get_application_config.go | 4 +- .../get_application_config_string.go | 4 +- .../super-mario-maker/get_buffer_queue.go | 4 +- .../super-mario-maker/get_course_record.go | 4 +- .../get_custom_ranking_by_data_id.go | 4 +- .../super-mario-maker/get_deletion_reason.go | 4 +- .../get_metas_with_course_record.go | 4 +- .../super-mario-maker/get_object_infos.go | 4 +- .../super-mario-maker/prepare_attach_file.go | 4 +- .../super-mario-maker/rate_custom_ranking.go | 4 +- .../recommended_course_search_object.go | 4 +- .../suggested_course_search_object.go | 4 +- .../super-mario-maker/upload_course_record.go | 4 +- nex/message-delivery/deliver_message.go | 4 +- ...register_common_secure_server_protocols.go | 42 +++++ nex/register_nex_protocols.go | 31 ---- nex/secure.go | 2 +- 36 files changed, 223 insertions(+), 650 deletions(-) create mode 100644 database/datastore/delete_object_by_data_id.go create mode 100644 database/datastore/get_object_owner_by_data_id.go delete mode 100644 nex/datastore/change_meta.go delete mode 100644 nex/datastore/complete_post_object.go delete mode 100644 nex/datastore/get_meta.go delete mode 100644 nex/datastore/get_metas_multiple_param.go delete mode 100644 nex/datastore/prepare_get_object.go delete mode 100644 nex/datastore/prepare_post_object.go delete mode 100644 nex/datastore/rate_objects.go diff --git a/README.md b/README.md index cb1252e..3b92696 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,65 @@ -# Super Mario Maker - Secure -### Pretendo Super Mario Maker secure server +# Super Mario Maker replacement server +Includes both the authentication and secure servers. Works on both WiiU and 3DS -## About -Only handles WiiU at this point. Only has enough implemented to get the Super Mario Maker app booting. Lots of things are not implemented -Does not actually authenticate users atm! \ No newline at end of file +## DataStore (S3) +This server requires an S3 compatible server to store user generated content. The WiiU and 3DS only support TLS versions 1.0 and 1.1 with RSA SSL ciphers, so an S3 server supporting these is required. The server must also support presigned `POST` URLs. This does not leave many options, as nearly all S3 cloud providers no longer support one of these 2 things. Even AWS, the creators of S3 and the provider Nintendo uses, is [dropping support for TLS versions below 1.2 in December 2023](https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints/) + +For this reason, the recommended setup is using [MinIO](https://min.io/) to self host your S3 server and using [Cloudflare Tunnels](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) to act as your reverse proxy. Tunnels support TLS versions 1.0 and 1.1 with the required ciphers, essentially using it as a TLS proxy. This does come at some cost, and you now must manage data storage and security yourself through MinIO, but there are no other options at this time outside of self hosting + +## Compiling + +### Setup +Install [Go](https://go.dev/doc/install) and [git](https://git-scm.com/downloads), then clone and enter the repository + +```bash +$ git clone https://github.com/PretendoNetwork/super-mario-maker +$ cd super-mario-maker +``` + +### Compiling using `go` +To compile using Go, `go get` the required modules and then `go build` to your desired location. You may also want to tidy the go modules, though this is optional + +```bash +$ go get -u +$ go mod tidy +$ go build -o build/super-mario-maker +``` + +The server is now built to `build/super-mario-maker` + +When compiling with only Go, the authentication servers build string is not automatically set. This should not cause any issues with gameplay, but it means that the server build will not be visible in any packet dumps or logs a title may produce + +To compile the servers with the authentication server build string, add `-ldflags "-X 'main.serverBuildString=BUILD_STRING_HERE'"` to the build command, or use `make` to compile the server + +### Compiling using `make` +Compiling using `make` will read the local `.git` directory to create a dynamic authentication server build string, based on your repositories remote origin and current commit + +Install `make` either through your systems package manager or the [official download](https://www.gnu.org/software/make/). We provide a `default` rule which compiles [using `go`](#compiling-using-go) + +To build using `go` + +```bash +$ make +``` + +The server is now built to `build/super-mario-maker` + +## Configuration +All configuration options are handled via environment variables + +`.env` files are supported + +| Name | Description | Required | +|-------------------------------------|-----------------------------------------------------------------------|-----------------------------------------------| +| `PN_SMM_POSTGRES_URI` | Fully qualified URI to your Postgres server | Yes | +| `PN_SMM_AUTHENTICATION_SERVER_PORT` | Port for the authentication server | Yes | +| `PN_SMM_SECURE_SERVER_HOST` | Host name for the secure server | Yes | +| `PN_SMM_SECURE_SERVER_PORT` | Port for the secure server | Yes | +| `PN_SMM_KERBEROS_PASSWORD` | Password used as part of the internal server data in Kerberos tickets | No (Default password `password` will be used) | +| `PN_SMM_CONFIG_S3_ENDPOINT` | S3 server endpoint | Yes | +| `PN_SMM_CONFIG_S3_ACCESS_KEY` | S3 access key ID | Yes | +| `PN_SMM_CONFIG_S3_ACCESS_SECRET` | S3 secret | Yes | +| `PN_SMM_CONFIG_S3_BUCKET` | S3 bucket | Yes | +| `PN_SMM_ACCOUNT_GRPC_HOST` | Host name for your account server gRPC service | Yes | +| `PN_SMM_ACCOUNT_GRPC_PORT` | Port for your account server gRPC service | Yes | +| `PN_SMM_ACCOUNT_GRPC_API_KEY` | API key for your account server gRPC service | No (Assumed to be an open gRPC API) | \ No newline at end of file diff --git a/database/datastore/delete_object_by_data_id.go b/database/datastore/delete_object_by_data_id.go new file mode 100644 index 0000000..9bc7f59 --- /dev/null +++ b/database/datastore/delete_object_by_data_id.go @@ -0,0 +1,23 @@ +package datastore_db + +import ( + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func DeleteObjectByDataID(dataID uint64) uint32 { + errCode := IsObjectAvailable(dataID) + if errCode != 0 { + return errCode + } + + _, err := database.Postgres.Exec(`UPDATE datastore.objects SET deleted=TRUE WHERE data_id=$1`, dataID) + if err != nil { + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return nex.Errors.DataStore.Unknown + } + + return 0 +} diff --git a/database/datastore/get_object_owner_by_data_id.go b/database/datastore/get_object_owner_by_data_id.go new file mode 100644 index 0000000..989b7ae --- /dev/null +++ b/database/datastore/get_object_owner_by_data_id.go @@ -0,0 +1,26 @@ +package datastore_db + +import ( + "database/sql" + + "github.com/PretendoNetwork/nex-go" + "github.com/PretendoNetwork/super-mario-maker-secure/database" + "github.com/PretendoNetwork/super-mario-maker-secure/globals" +) + +func GetObjectOwnerByDataID(dataID uint64) (uint32, uint32) { + var owner uint32 + + err := database.Postgres.QueryRow(`SELECT owner FROM datastore.objects WHERE data_id=$1`, dataID).Scan(&owner) + if err != nil { + if err == sql.ErrNoRows { + return 0, nex.Errors.DataStore.NotFound + } + + globals.Logger.Error(err.Error()) + // TODO - Send more specific errors? + return 0, nex.Errors.DataStore.Unknown + } + + return owner, 0 +} diff --git a/database/datastore/super-mario-maker/get_user_course_object_ids.go b/database/datastore/super-mario-maker/get_user_course_object_ids.go index cb6eda0..1103222 100644 --- a/database/datastore/super-mario-maker/get_user_course_object_ids.go +++ b/database/datastore/super-mario-maker/get_user_course_object_ids.go @@ -39,7 +39,6 @@ func GetUserCourseObjectIDs(ownerPID uint32) ([]uint64, uint32) { errCode := datastore_db.IsObjectAvailable(dataID) if errCode != 0 { - globals.Logger.Errorf("Got error code %d for object %d", errCode, dataID) continue } diff --git a/go.mod b/go.mod index 495534d..c61679c 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.21 require ( github.com/PretendoNetwork/grpc-go v1.0.2 github.com/PretendoNetwork/nex-go v1.0.41 - github.com/PretendoNetwork/nex-protocols-common-go v1.0.29 - github.com/PretendoNetwork/nex-protocols-go v1.0.55 + github.com/PretendoNetwork/nex-protocols-common-go v1.0.30 + github.com/PretendoNetwork/nex-protocols-go v1.0.58 github.com/PretendoNetwork/plogger-go v1.0.4 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 @@ -39,7 +39,7 @@ require ( golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect ) diff --git a/go.sum b/go.sum index 3b06031..42378af 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,10 @@ github.com/PretendoNetwork/grpc-go v1.0.2 h1:9TvKmX7dCOANyoHEra1MMYqS1N/RGav66TR github.com/PretendoNetwork/grpc-go v1.0.2/go.mod h1:XZjEsij9lL7HJBNkH6JPbBIkUSq/1rjflvjGdv+DAj0= github.com/PretendoNetwork/nex-go v1.0.41 h1:TcBb1Bpe2KAB+AXaGX1K9NVQBRtZJIoy4yCvRde2xbI= github.com/PretendoNetwork/nex-go v1.0.41/go.mod h1:QwHEa165DeVd0xIuthrgc3j6NWXT8lyPSG6t5kC/Shk= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.29 h1:ZvZNsAbdgWIGggZhn6EePuyYqI34FuV4C+fMkmmwWSA= -github.com/PretendoNetwork/nex-protocols-common-go v1.0.29/go.mod h1:4jYhLg+Cb2qhJHyyA+f2OwCrmc98zuTO3JPWK22mIKw= -github.com/PretendoNetwork/nex-protocols-go v1.0.55 h1:8QMeCNO2eZO4m7CRT/nv2WWm+gDh/REKR5jKTYQaaCs= -github.com/PretendoNetwork/nex-protocols-go v1.0.55/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.30 h1:z2BvyG/3x1lW8sx6Ml83G0Lkj5J9hdb0bjdZuuDCYSE= +github.com/PretendoNetwork/nex-protocols-common-go v1.0.30/go.mod h1:37jNRX6M/s0xA/gc4BccO8k2GLG1lpMZXAtIYRCZCTY= +github.com/PretendoNetwork/nex-protocols-go v1.0.58 h1:W8pZ2LOlJm/mo/UOJjkLWNVHs0jQmkoa8qoI5A1WVyY= +github.com/PretendoNetwork/nex-protocols-go v1.0.58/go.mod h1:136762CMIcAsTZDrt4W7gDE4ppiBuc9zN2QFOHESjS8= github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= github.com/PretendoNetwork/plogger-go v1.0.4/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -87,8 +87,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= diff --git a/nex/authentication.go b/nex/authentication.go index 10d913f..7518c74 100644 --- a/nex/authentication.go +++ b/nex/authentication.go @@ -14,7 +14,7 @@ func StartAuthenticationServer() { globals.AuthenticationServer = nex.NewServer() globals.AuthenticationServer.SetPRUDPVersion(1) globals.AuthenticationServer.SetPRUDPProtocolMinorVersion(2) - globals.AuthenticationServer.SetDefaultNEXVersion(nex.NewNEXVersion(3, 8, 3)) + globals.AuthenticationServer.SetDefaultNEXVersion(nex.NewPatchedNEXVersion(3, 8, 3, "AMAJ")) globals.AuthenticationServer.SetKerberosPassword(globals.KerberosPassword) globals.AuthenticationServer.SetAccessKey("9f2b4678") diff --git a/nex/datastore/change_meta.go b/nex/datastore/change_meta.go deleted file mode 100644 index bd48473..0000000 --- a/nex/datastore/change_meta.go +++ /dev/null @@ -1,69 +0,0 @@ -package nex_datastore - -import ( - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func ChangeMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreChangeMetaParam) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.Unknown - } - - metaInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID) - if errCode != 0 { - return errCode - } - - // TODO - Is this the right permission? - errCode = globals.VerifyObjectPermission(metaInfo.OwnerID, client.PID(), metaInfo.DelPermission) - if errCode != 0 { - return errCode - } - - // TODO - Refactor this into a single query. Use a query builder like goqu? - if param.ModifiesFlag&0x08 != 0 { - errCode = datastore_db.UpdateObjectPeriodByDataIDWithPassword(param.DataID, param.Period, param.UpdatePassword) - if errCode != 0 { - return errCode - } - } - - if param.ModifiesFlag&0x10 != 0 { - errCode = datastore_db.UpdateObjectMetaBinaryByDataIDWithPassword(param.DataID, param.MetaBinary, param.UpdatePassword) - if errCode != 0 { - return errCode - } - } - - if param.ModifiesFlag&0x80 != 0 { - errCode = datastore_db.UpdateObjectDataTypeByDataIDWithPassword(param.DataID, param.DataType, param.UpdatePassword) - if errCode != 0 { - return errCode - } - } - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodChangeMeta, nil) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/complete_post_object.go b/nex/datastore/complete_post_object.go deleted file mode 100644 index 02ce39e..0000000 --- a/nex/datastore/complete_post_object.go +++ /dev/null @@ -1,66 +0,0 @@ -package nex_datastore - -import ( - "fmt" - "os" - - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func CompletePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreCompletePostParam) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.Unknown - } - - // TODO - What is param.IsSuccess? Is this correct? - if param.IsSuccess { - bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.bin", param.DataID) - - objectSizeS3, err := globals.S3ObjectSize(bucket, key) - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.NotFound - } - - objectSizeDB, errCode := datastore_db.GetObjectSizeDataID(param.DataID) - if errCode != 0 { - return errCode - } - - if objectSizeS3 != uint64(objectSizeDB) { - // TODO - Is this a good error? - return nex.Errors.DataStore.Unknown - } - - errCode = datastore_db.UpdateObjectUploadCompletedByDataID(param.DataID, true) - if errCode != 0 { - return errCode - } - } - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodCompletePostObject, nil) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/get_meta.go b/nex/datastore/get_meta.go deleted file mode 100644 index 4336470..0000000 --- a/nex/datastore/get_meta.go +++ /dev/null @@ -1,81 +0,0 @@ -package nex_datastore - -import ( - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func GetMeta(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreGetMetaParam) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.Unknown - } - - var pMetaInfo *datastore_types.DataStoreMetaInfo - var errCode uint32 - - // * Real server ignores PersistenceTarget if DataID is set - if param.DataID == 0 { - pMetaInfo, errCode = datastore_db.GetObjectInfoByPersistenceTargetWithPassword(param.PersistenceTarget, param.AccessPassword) - } else { - pMetaInfo, errCode = datastore_db.GetObjectInfoByDataIDWithPassword(param.DataID, param.AccessPassword) - } - - if errCode != 0 { - return errCode - } - - errCode = globals.VerifyObjectPermission(pMetaInfo.OwnerID, client.PID(), pMetaInfo.Permission) - if errCode != 0 { - return errCode - } - - // * This is kind of backwards. - // * The database pulls this data - // * by default, so it can be done - // * in a single query. So instead - // * of checking if a flag *IS* - // * set, and conditionally *ADDING* - // * the fields, we check if a flag - // * is *NOT* set and conditionally - // * *REMOVE* the field - if param.ResultOption&0x1 == 0 { - pMetaInfo.Tags = make([]string, 0) - } - - if param.ResultOption&0x2 == 0 { - pMetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) - } - - if param.ResultOption&0x4 == 0 { - pMetaInfo.MetaBinary = make([]byte, 0) - } - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - rmcResponseStream.WriteStructure(pMetaInfo) - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodGetMeta, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/get_metas_multiple_param.go b/nex/datastore/get_metas_multiple_param.go deleted file mode 100644 index 619c649..0000000 --- a/nex/datastore/get_metas_multiple_param.go +++ /dev/null @@ -1,144 +0,0 @@ -package nex_datastore - -import ( - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func GetMetasMultipleParam(err error, client *nex.Client, callID uint32, params []*datastore_types.DataStoreGetMetaParam) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.Unknown - } - - pMetaInfo := make([]*datastore_types.DataStoreMetaInfo, 0, len(params)) - pResults := make([]*nex.Result, 0, len(params)) - - for _, param := range params { - var objectInfo *datastore_types.DataStoreMetaInfo - var errCode uint32 - - // * Real server ignores PersistenceTarget if DataID is set - if param.DataID == 0 { - objectInfo, errCode = datastore_db.GetObjectInfoByPersistenceTargetWithPassword(param.PersistenceTarget, param.AccessPassword) - } else { - objectInfo, errCode = datastore_db.GetObjectInfoByDataIDWithPassword(param.DataID, param.AccessPassword) - } - - if errCode != 0 { - // TODO - Maybe this should be broken out into a util function in globals? - objectInfo = datastore_types.NewDataStoreMetaInfo() - objectInfo.DataID = 0 - objectInfo.OwnerID = 0 - objectInfo.Size = 0 - objectInfo.Name = "" - objectInfo.DataType = 0 - objectInfo.MetaBinary = []byte{} - objectInfo.Permission = datastore_types.NewDataStorePermission() - objectInfo.Permission.Permission = 0 - objectInfo.Permission.RecipientIDs = []uint32{} - objectInfo.DelPermission = datastore_types.NewDataStorePermission() - objectInfo.DelPermission.Permission = 0 - objectInfo.DelPermission.RecipientIDs = []uint32{} - objectInfo.CreatedTime = nex.NewDateTime(0) - objectInfo.UpdatedTime = nex.NewDateTime(0) - objectInfo.Period = 0 - objectInfo.Status = 0 - objectInfo.ReferredCnt = 0 - objectInfo.ReferDataID = 0 - objectInfo.Flag = 0 - objectInfo.ReferredTime = nex.NewDateTime(0) - objectInfo.ExpireTime = nex.NewDateTime(0) - objectInfo.Tags = []string{} - objectInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} - - pResults = append(pResults, nex.NewResultError(errCode)) - } else { - errCode = globals.VerifyObjectPermission(objectInfo.OwnerID, client.PID(), objectInfo.Permission) - if errCode != 0 { - // TODO - Maybe this should be broken out into a util function in globals? - objectInfo = datastore_types.NewDataStoreMetaInfo() - objectInfo.DataID = 0 - objectInfo.OwnerID = 0 - objectInfo.Size = 0 - objectInfo.Name = "" - objectInfo.DataType = 0 - objectInfo.MetaBinary = []byte{} - objectInfo.Permission = datastore_types.NewDataStorePermission() - objectInfo.Permission.Permission = 0 - objectInfo.Permission.RecipientIDs = []uint32{} - objectInfo.DelPermission = datastore_types.NewDataStorePermission() - objectInfo.DelPermission.Permission = 0 - objectInfo.DelPermission.RecipientIDs = []uint32{} - objectInfo.CreatedTime = nex.NewDateTime(0) - objectInfo.UpdatedTime = nex.NewDateTime(0) - objectInfo.Period = 0 - objectInfo.Status = 0 - objectInfo.ReferredCnt = 0 - objectInfo.ReferDataID = 0 - objectInfo.Flag = 0 - objectInfo.ReferredTime = nex.NewDateTime(0) - objectInfo.ExpireTime = nex.NewDateTime(0) - objectInfo.Tags = []string{} - objectInfo.Ratings = []*datastore_types.DataStoreRatingInfoWithSlot{} - - pResults = append(pResults, nex.NewResultError(errCode)) - } else { - pResults = append(pResults, nex.NewResultSuccess(nex.Errors.DataStore.Unknown)) - } - - // * This is kind of backwards. - // * The database pulls this data - // * by default, so it can be done - // * in a single query. So instead - // * of checking if a flag *IS* - // * set, and conditionally *ADDING* - // * the fields, we check if a flag - // * is *NOT* set and conditionally - // * *REMOVE* the field - if param.ResultOption&0x1 == 0 { - objectInfo.Tags = make([]string, 0) - } - - if param.ResultOption&0x2 == 0 { - objectInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0) - } - - if param.ResultOption&0x4 == 0 { - objectInfo.MetaBinary = make([]byte, 0) - } - } - - pMetaInfo = append(pMetaInfo, objectInfo) - } - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - rmcResponseStream.WriteListStructure(pMetaInfo) - rmcResponseStream.WriteListResult(pResults) - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodGetMetasMultipleParam, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/prepare_get_object.go b/nex/datastore/prepare_get_object.go deleted file mode 100644 index 163138d..0000000 --- a/nex/datastore/prepare_get_object.go +++ /dev/null @@ -1,73 +0,0 @@ -package nex_datastore - -import ( - "fmt" - "os" - "time" - - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func PrepareGetObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePrepareGetParam) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.Core.Unknown - } - - bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.bin", param.DataID) - - objectInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID) - if errCode != 0 { - return errCode - } - - errCode = globals.VerifyObjectPermission(objectInfo.OwnerID, client.PID(), objectInfo.Permission) - if errCode != 0 { - return errCode - } - - URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15) - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.OperationNotAllowed - } - - pReqGetInfo := datastore_types.NewDataStoreReqGetInfo() - - pReqGetInfo.URL = URL.String() - pReqGetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqGetInfo.Size = objectInfo.Size - pReqGetInfo.RootCACert = []byte{} - pReqGetInfo.DataID = param.DataID - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - rmcResponseStream.WriteStructure(pReqGetInfo) - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodPrepareGetObject, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/prepare_post_object.go b/nex/datastore/prepare_post_object.go deleted file mode 100644 index da2284d..0000000 --- a/nex/datastore/prepare_post_object.go +++ /dev/null @@ -1,82 +0,0 @@ -package nex_datastore - -import ( - "fmt" - "os" - "time" - - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func PreparePostObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStorePreparePostParam) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.Unknown - } - - dataID, errCode := datastore_db.InitializeObjectByPreparePostParam(client.PID(), param) - if errCode != 0 { - globals.Logger.Errorf("Error code %d on object init", errCode) - return errCode - } - - // TODO - Should this be moved to InitializeObjectByPreparePostParam? - for _, ratingInitParamWithSlot := range param.RatingInitParams { - errCode = datastore_db.InitializeObjectRatingWithSlot(dataID, ratingInitParamWithSlot) - if errCode != 0 { - globals.Logger.Errorf("Error code %d on rating init", errCode) - return errCode - } - } - - bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET") - key := fmt.Sprintf("%d.bin", dataID) - - URL, formData, _ := globals.Presigner.PostObject(bucket, key, time.Minute*15) - - pReqPostInfo := datastore_types.NewDataStoreReqPostInfo() - - pReqPostInfo.DataID = dataID - pReqPostInfo.URL = URL.String() - pReqPostInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{} - pReqPostInfo.FormFields = make([]*datastore_types.DataStoreKeyValue, 0, len(formData)) - pReqPostInfo.RootCACert = []byte{} - - for key, value := range formData { - field := datastore_types.NewDataStoreKeyValue() - field.Key = key - field.Value = value - - pReqPostInfo.FormFields = append(pReqPostInfo.FormFields, field) - } - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - rmcResponseStream.WriteStructure(pReqPostInfo) - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodPreparePostObject, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/rate_objects.go b/nex/datastore/rate_objects.go deleted file mode 100644 index 1827338..0000000 --- a/nex/datastore/rate_objects.go +++ /dev/null @@ -1,68 +0,0 @@ -package nex_datastore - -import ( - nex "github.com/PretendoNetwork/nex-go" - datastore "github.com/PretendoNetwork/nex-protocols-go/datastore" - datastore_types "github.com/PretendoNetwork/nex-protocols-go/datastore/types" - datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" - "github.com/PretendoNetwork/super-mario-maker-secure/globals" -) - -func RateObjects(err error, client *nex.Client, callID uint32, targets []*datastore_types.DataStoreRatingTarget, params []*datastore_types.DataStoreRateObjectParam, transactional bool, fetchRatings bool) uint32 { - if err != nil { - globals.Logger.Error(err.Error()) - return nex.Errors.DataStore.Unknown - } - - pRatings := make([]*datastore_types.DataStoreRatingInfo, 0) - pResults := make([]*nex.Result, 0) - - // * Real DataStore does not actually check this. - // * I just didn't feel like working out the - // * logic for differing sized lists. So force - // * them to always be the same - if len(targets) != len(params) { - return nex.Errors.DataStore.InvalidArgument - } - - for i := 0; i < len(targets); i++ { - target := targets[i] - param := params[i] - - rating, errCode := datastore_db.RateObjectWithPassword(target.DataID, target.Slot, param.RatingValue, param.AccessPassword) - if errCode != 0 { - return errCode - } - - if fetchRatings { - pRatings = append(pRatings, rating) - } - } - - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - rmcResponseStream.WriteListStructure(pRatings) - rmcResponseStream.WriteListResult(pResults) // * pResults is always empty - - rmcResponseBody := rmcResponseStream.Bytes() - - rmcResponse := nex.NewRMCResponse(datastore.ProtocolID, callID) - rmcResponse.SetSuccess(datastore.MethodRateObjects, rmcResponseBody) - - rmcResponseBytes := rmcResponse.Bytes() - - responsePacket, _ := nex.NewPacketV1(client, nil) - - responsePacket.SetVersion(1) - responsePacket.SetSource(0xA1) - responsePacket.SetDestination(0xAF) - responsePacket.SetType(nex.DataPacket) - responsePacket.SetPayload(rmcResponseBytes) - - responsePacket.AddFlag(nex.FlagNeedsAck) - responsePacket.AddFlag(nex.FlagReliable) - - globals.SecureServer.Send(responsePacket) - - return 0 -} diff --git a/nex/datastore/super-mario-maker/add_to_buffer_queues.go b/nex/datastore/super-mario-maker/add_to_buffer_queues.go index 2d4ee36..5c4bc7c 100644 --- a/nex/datastore/super-mario-maker/add_to_buffer_queues.go +++ b/nex/datastore/super-mario-maker/add_to_buffer_queues.go @@ -9,12 +9,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func AddToBufferQueues(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) uint32 { +func AddToBufferQueues(err error, packet nex.PacketInterface, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + pResults := make([]*nex.Result, 0) // * The number of params and buffers CAN be allowed diff --git a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go index 212e003..af404fd 100644 --- a/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go +++ b/nex/datastore/super-mario-maker/check_rate_custom_ranking_counter.go @@ -6,12 +6,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CheckRateCustomRankingCounter(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { +func CheckRateCustomRankingCounter(err error, packet nex.PacketInterface, callID uint32, applicationID uint32) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * No idea what this is. Only seen application ID 0 // * used, and it's always true? Unsure what this checks isBelowThreshold := false diff --git a/nex/datastore/super-mario-maker/complete_attach_file.go b/nex/datastore/super-mario-maker/complete_attach_file.go index 67a9a62..3425791 100644 --- a/nex/datastore/super-mario-maker/complete_attach_file.go +++ b/nex/datastore/super-mario-maker/complete_attach_file.go @@ -12,12 +12,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CompleteAttachFile(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreCompletePostParam) uint32 { +func CompleteAttachFile(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreCompletePostParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // TODO - What is param.IsSuccess? Is this correct? if !param.IsSuccess { return nex.Errors.DataStore.InvalidArgument diff --git a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go index b1ed747..7dba0a8 100644 --- a/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go +++ b/nex/datastore/super-mario-maker/ctr_pick_up_course_search_object.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func CTRPickUpCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { +func CTRPickUpCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * This method is only used by the 3DS version // * of Super Mario Maker and is functionally // * identical to the WiiU versions diff --git a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go index a9d6960..59b71f4 100644 --- a/nex/datastore/super-mario-maker/followings_latest_course_search_object.go +++ b/nex/datastore/super-mario-maker/followings_latest_course_search_object.go @@ -9,12 +9,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func FollowingsLatestCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { +func FollowingsLatestCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0) // * This seems to ONLY be used to get rankings for course objects diff --git a/nex/datastore/super-mario-maker/get_application_config.go b/nex/datastore/super-mario-maker/get_application_config.go index 2c63ed9..4452a0a 100644 --- a/nex/datastore/super-mario-maker/get_application_config.go +++ b/nex/datastore/super-mario-maker/get_application_config.go @@ -16,12 +16,14 @@ import ( // * more, but 100 is fine tbh var MAX_COURSE_UPLOADS uint32 = 100 -func GetApplicationConfig(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { +func GetApplicationConfig(err error, packet nex.PacketInterface, callID uint32, applicationID uint32) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + config := make([]uint32, 0) switch applicationID { diff --git a/nex/datastore/super-mario-maker/get_application_config_string.go b/nex/datastore/super-mario-maker/get_application_config_string.go index 908d7cb..3063982 100644 --- a/nex/datastore/super-mario-maker/get_application_config_string.go +++ b/nex/datastore/super-mario-maker/get_application_config_string.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetApplicationConfigString(err error, client *nex.Client, callID uint32, applicationID uint32) uint32 { +func GetApplicationConfigString(err error, packet nex.PacketInterface, callID uint32, applicationID uint32) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * Word blacklists? config := make([]string, 0) diff --git a/nex/datastore/super-mario-maker/get_buffer_queue.go b/nex/datastore/super-mario-maker/get_buffer_queue.go index 81bf465..12894fe 100644 --- a/nex/datastore/super-mario-maker/get_buffer_queue.go +++ b/nex/datastore/super-mario-maker/get_buffer_queue.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetBufferQueue(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) uint32 { +func GetBufferQueue(err error, packet nex.PacketInterface, callID uint32, param *datastore_super_mario_maker_types.BufferQueueParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + pBufferQueue, errCode := datastore_smm_db.GetBufferQueuesByDataIDAndSlot(param.DataID, param.Slot) if errCode != 0 { globals.Logger.Errorf("Error code %d for object %d", errCode, param.DataID) diff --git a/nex/datastore/super-mario-maker/get_course_record.go b/nex/datastore/super-mario-maker/get_course_record.go index 4be4823..2cf8d33 100644 --- a/nex/datastore/super-mario-maker/get_course_record.go +++ b/nex/datastore/super-mario-maker/get_course_record.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCourseRecordParam) uint32 { +func GetCourseRecord(err error, packet nex.PacketInterface, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCourseRecordParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + result, errCode := datastore_smm_db.GetCourseRecordByDataIDAndSlot(param.DataID, param.Slot) if errCode != 0 { return errCode diff --git a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go index 628b2f1..2d89695 100644 --- a/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go +++ b/nex/datastore/super-mario-maker/get_custom_ranking_by_data_id.go @@ -9,12 +9,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetCustomRankingByDataID(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) uint32 { +func GetCustomRankingByDataID(err error, packet nex.PacketInterface, callID uint32, param *datastore_super_mario_maker_types.DataStoreGetCustomRankingByDataIDParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + pRankingResult := datastore_smm_db.GetCustomRankingsByDataIDs(param.ApplicationID, param.DataIDList) pResults := make([]*nex.Result, 0, len(param.DataIDList)) diff --git a/nex/datastore/super-mario-maker/get_deletion_reason.go b/nex/datastore/super-mario-maker/get_deletion_reason.go index 9e52992..475513b 100644 --- a/nex/datastore/super-mario-maker/get_deletion_reason.go +++ b/nex/datastore/super-mario-maker/get_deletion_reason.go @@ -6,12 +6,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetDeletionReason(err error, client *nex.Client, callID uint32, dataIDLst []uint64) uint32 { +func GetDeletionReason(err error, packet nex.PacketInterface, callID uint32, dataIDLst []uint64) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // TODO - Complete this // * It's not actually known what the // * real "deletion reason" values are. diff --git a/nex/datastore/super-mario-maker/get_metas_with_course_record.go b/nex/datastore/super-mario-maker/get_metas_with_course_record.go index 6bf6ef4..effc362 100644 --- a/nex/datastore/super-mario-maker/get_metas_with_course_record.go +++ b/nex/datastore/super-mario-maker/get_metas_with_course_record.go @@ -10,12 +10,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetMetasWithCourseRecord(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, metaParam *datastore_types.DataStoreGetMetaParam) uint32 { +func GetMetasWithCourseRecord(err error, packet nex.PacketInterface, callID uint32, params []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, metaParam *datastore_types.DataStoreGetMetaParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * The functionality here is largely a guess // * based on how GetCourseRecord works and // * based on testing with a custom client. diff --git a/nex/datastore/super-mario-maker/get_object_infos.go b/nex/datastore/super-mario-maker/get_object_infos.go index de1b98d..10c5395 100644 --- a/nex/datastore/super-mario-maker/get_object_infos.go +++ b/nex/datastore/super-mario-maker/get_object_infos.go @@ -13,12 +13,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func GetObjectInfos(err error, client *nex.Client, callID uint32, dataIDs []uint64) uint32 { +func GetObjectInfos(err error, packet nex.PacketInterface, callID uint32, dataIDs []uint64) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + pInfos := make([]*datastore_super_mario_maker_types.DataStoreFileServerObjectInfo, 0) for _, dataID := range dataIDs { diff --git a/nex/datastore/super-mario-maker/prepare_attach_file.go b/nex/datastore/super-mario-maker/prepare_attach_file.go index a84f5e3..a67d5c3 100644 --- a/nex/datastore/super-mario-maker/prepare_attach_file.go +++ b/nex/datastore/super-mario-maker/prepare_attach_file.go @@ -14,12 +14,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func PrepareAttachFile(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreAttachFileParam) uint32 { +func PrepareAttachFile(err error, packet nex.PacketInterface, callID uint32, param *datastore_super_mario_maker_types.DataStoreAttachFileParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * This method seems to be only used at "attach" // * a file to an existing object. In practice, // * SMM will use this to upload a courses preview diff --git a/nex/datastore/super-mario-maker/rate_custom_ranking.go b/nex/datastore/super-mario-maker/rate_custom_ranking.go index 0b0c895..d47f4db 100644 --- a/nex/datastore/super-mario-maker/rate_custom_ranking.go +++ b/nex/datastore/super-mario-maker/rate_custom_ranking.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func RateCustomRanking(err error, client *nex.Client, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) uint32 { +func RateCustomRanking(err error, packet nex.PacketInterface, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // TODO - Check the period. The real server does check this, just unsure what it means or what the check is for _, param := range params { datastore_smm_db.InsertOrUpdateCustomRanking(param.DataID, param.ApplicationID, param.Score) diff --git a/nex/datastore/super-mario-maker/recommended_course_search_object.go b/nex/datastore/super-mario-maker/recommended_course_search_object.go index 195cbec..e09d604 100644 --- a/nex/datastore/super-mario-maker/recommended_course_search_object.go +++ b/nex/datastore/super-mario-maker/recommended_course_search_object.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func RecommendedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { +func RecommendedCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * This method is used in 100 Mario and Course World // * // * extraData seems to be a set of filters defining a diff --git a/nex/datastore/super-mario-maker/suggested_course_search_object.go b/nex/datastore/super-mario-maker/suggested_course_search_object.go index 1b85005..3068213 100644 --- a/nex/datastore/super-mario-maker/suggested_course_search_object.go +++ b/nex/datastore/super-mario-maker/suggested_course_search_object.go @@ -10,12 +10,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func SuggestedCourseSearchObject(err error, client *nex.Client, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { +func SuggestedCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // * This method is called when a course is completed // * to show the scrolling courses at the bottom of the // * screen. extraData[0] is the DataID of the current diff --git a/nex/datastore/super-mario-maker/upload_course_record.go b/nex/datastore/super-mario-maker/upload_course_record.go index 40aa1fa..9c6a306 100644 --- a/nex/datastore/super-mario-maker/upload_course_record.go +++ b/nex/datastore/super-mario-maker/upload_course_record.go @@ -8,12 +8,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func UploadCourseRecord(err error, client *nex.Client, callID uint32, param *datastore_super_mario_maker_types.DataStoreUploadCourseRecordParam) uint32 { +func UploadCourseRecord(err error, packet nex.PacketInterface, callID uint32, param *datastore_super_mario_maker_types.DataStoreUploadCourseRecordParam) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + errCode := datastore_smm_db.InsertOrUpdateCourseRecord(param.DataID, param.Slot, client.PID(), param.Score) if errCode != 0 { return errCode diff --git a/nex/message-delivery/deliver_message.go b/nex/message-delivery/deliver_message.go index 66c7b8f..bc55b2b 100644 --- a/nex/message-delivery/deliver_message.go +++ b/nex/message-delivery/deliver_message.go @@ -6,12 +6,14 @@ import ( "github.com/PretendoNetwork/super-mario-maker-secure/globals" ) -func DeliverMessage(err error, client *nex.Client, callID uint32, oUserMessage *nex.DataHolder) uint32 { +func DeliverMessage(err error, packet nex.PacketInterface, callID uint32, oUserMessage *nex.DataHolder) uint32 { if err != nil { globals.Logger.Error(err.Error()) return nex.Errors.DataStore.Unknown } + client := packet.Sender() + // TODO - See what this does rmcResponse := nex.NewRMCResponse(message_delivery.ProtocolID, callID) diff --git a/nex/register_common_secure_server_protocols.go b/nex/register_common_secure_server_protocols.go index 1f78067..e05a93e 100644 --- a/nex/register_common_secure_server_protocols.go +++ b/nex/register_common_secure_server_protocols.go @@ -1,10 +1,52 @@ package nex import ( + "os" + + datastore "github.com/PretendoNetwork/nex-protocols-common-go/datastore" secureconnection "github.com/PretendoNetwork/nex-protocols-common-go/secure-connection" + datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore" "github.com/PretendoNetwork/super-mario-maker-secure/globals" + nex_datastore_super_mario_maker "github.com/PretendoNetwork/super-mario-maker-secure/nex/datastore/super-mario-maker" ) func registerCommonSecureProtocols() { secureconnection.NewCommonSecureConnectionProtocol(globals.SecureServer) + + commonDataStoreProtocol := datastore.NewCommonDataStoreProtocol(globals.SecureServer) + + commonDataStoreProtocol.SetS3Bucket(os.Getenv("PN_SMM_CONFIG_S3_BUCKET")) + commonDataStoreProtocol.SetMinIOClient(globals.MinIOClient) + commonDataStoreProtocol.GetObjectInfoByDataID(datastore_db.GetObjectInfoByDataID) + commonDataStoreProtocol.UpdateObjectPeriodByDataIDWithPassword(datastore_db.UpdateObjectPeriodByDataIDWithPassword) + commonDataStoreProtocol.UpdateObjectMetaBinaryByDataIDWithPassword(datastore_db.UpdateObjectMetaBinaryByDataIDWithPassword) + commonDataStoreProtocol.UpdateObjectDataTypeByDataIDWithPassword(datastore_db.UpdateObjectDataTypeByDataIDWithPassword) + commonDataStoreProtocol.GetObjectSizeDataID(datastore_db.GetObjectSizeDataID) + commonDataStoreProtocol.UpdateObjectUploadCompletedByDataID(datastore_db.UpdateObjectUploadCompletedByDataID) + commonDataStoreProtocol.GetObjectInfoByPersistenceTargetWithPassword(datastore_db.GetObjectInfoByPersistenceTargetWithPassword) + commonDataStoreProtocol.GetObjectInfoByDataIDWithPassword(datastore_db.GetObjectInfoByDataIDWithPassword) + commonDataStoreProtocol.InitializeObjectByPreparePostParam(datastore_db.InitializeObjectByPreparePostParam) + commonDataStoreProtocol.InitializeObjectRatingWithSlot(datastore_db.InitializeObjectRatingWithSlot) + commonDataStoreProtocol.RateObjectWithPassword(datastore_db.RateObjectWithPassword) + commonDataStoreProtocol.DeleteObjectByDataID(datastore_db.DeleteObjectByDataID) + commonDataStoreProtocol.GetObjectOwnerByDataID(datastore_db.GetObjectOwnerByDataID) + + commonDataStoreProtocol.SuperMarioMakerProtocol.GetObjectInfos(nex_datastore_super_mario_maker.GetObjectInfos) + commonDataStoreProtocol.SuperMarioMakerProtocol.RateCustomRanking(nex_datastore_super_mario_maker.RateCustomRanking) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetCustomRankingByDataID(nex_datastore_super_mario_maker.GetCustomRankingByDataID) + commonDataStoreProtocol.SuperMarioMakerProtocol.AddToBufferQueues(nex_datastore_super_mario_maker.AddToBufferQueues) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetBufferQueue(nex_datastore_super_mario_maker.GetBufferQueue) + commonDataStoreProtocol.SuperMarioMakerProtocol.CompleteAttachFile(nex_datastore_super_mario_maker.CompleteAttachFile) + commonDataStoreProtocol.SuperMarioMakerProtocol.PrepareAttachFile(nex_datastore_super_mario_maker.PrepareAttachFile) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetApplicationConfig(nex_datastore_super_mario_maker.GetApplicationConfig) + commonDataStoreProtocol.SuperMarioMakerProtocol.FollowingsLatestCourseSearchObject(nex_datastore_super_mario_maker.FollowingsLatestCourseSearchObject) + commonDataStoreProtocol.SuperMarioMakerProtocol.RecommendedCourseSearchObject(nex_datastore_super_mario_maker.RecommendedCourseSearchObject) + commonDataStoreProtocol.SuperMarioMakerProtocol.SuggestedCourseSearchObject(nex_datastore_super_mario_maker.SuggestedCourseSearchObject) + commonDataStoreProtocol.SuperMarioMakerProtocol.UploadCourseRecord(nex_datastore_super_mario_maker.UploadCourseRecord) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetCourseRecord(nex_datastore_super_mario_maker.GetCourseRecord) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetApplicationConfigString(nex_datastore_super_mario_maker.GetApplicationConfigString) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetDeletionReason(nex_datastore_super_mario_maker.GetDeletionReason) + commonDataStoreProtocol.SuperMarioMakerProtocol.GetMetasWithCourseRecord(nex_datastore_super_mario_maker.GetMetasWithCourseRecord) + commonDataStoreProtocol.SuperMarioMakerProtocol.CheckRateCustomRankingCounter(nex_datastore_super_mario_maker.CheckRateCustomRankingCounter) + commonDataStoreProtocol.SuperMarioMakerProtocol.CTRPickUpCourseSearchObject(nex_datastore_super_mario_maker.CTRPickUpCourseSearchObject) } diff --git a/nex/register_nex_protocols.go b/nex/register_nex_protocols.go index 20436a8..8bb8d51 100644 --- a/nex/register_nex_protocols.go +++ b/nex/register_nex_protocols.go @@ -1,43 +1,12 @@ package nex import ( - datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/datastore/super-mario-maker" message_delivery "github.com/PretendoNetwork/nex-protocols-go/message-delivery" "github.com/PretendoNetwork/super-mario-maker-secure/globals" - nex_datastore "github.com/PretendoNetwork/super-mario-maker-secure/nex/datastore" - nex_datastore_super_mario_maker "github.com/PretendoNetwork/super-mario-maker-secure/nex/datastore/super-mario-maker" nex_message_delivery "github.com/PretendoNetwork/super-mario-maker-secure/nex/message-delivery" ) func registerNEXProtocols() { - datastoreSMMProtocol := datastore_super_mario_maker.NewProtocol(globals.SecureServer) - - datastoreSMMProtocol.GetMeta(nex_datastore.GetMeta) - datastoreSMMProtocol.PreparePostObject(nex_datastore.PreparePostObject) - datastoreSMMProtocol.PrepareGetObject(nex_datastore.PrepareGetObject) - datastoreSMMProtocol.CompletePostObject(nex_datastore.CompletePostObject) - datastoreSMMProtocol.GetMetasMultipleParam(nex_datastore.GetMetasMultipleParam) - datastoreSMMProtocol.ChangeMeta(nex_datastore.ChangeMeta) - datastoreSMMProtocol.RateObjects(nex_datastore.RateObjects) - datastoreSMMProtocol.GetObjectInfos(nex_datastore_super_mario_maker.GetObjectInfos) - datastoreSMMProtocol.RateCustomRanking(nex_datastore_super_mario_maker.RateCustomRanking) - datastoreSMMProtocol.GetCustomRankingByDataID(nex_datastore_super_mario_maker.GetCustomRankingByDataID) - datastoreSMMProtocol.AddToBufferQueues(nex_datastore_super_mario_maker.AddToBufferQueues) - datastoreSMMProtocol.GetBufferQueue(nex_datastore_super_mario_maker.GetBufferQueue) - datastoreSMMProtocol.CompleteAttachFile(nex_datastore_super_mario_maker.CompleteAttachFile) - datastoreSMMProtocol.PrepareAttachFile(nex_datastore_super_mario_maker.PrepareAttachFile) - datastoreSMMProtocol.GetApplicationConfig(nex_datastore_super_mario_maker.GetApplicationConfig) - datastoreSMMProtocol.FollowingsLatestCourseSearchObject(nex_datastore_super_mario_maker.FollowingsLatestCourseSearchObject) - datastoreSMMProtocol.RecommendedCourseSearchObject(nex_datastore_super_mario_maker.RecommendedCourseSearchObject) - datastoreSMMProtocol.SuggestedCourseSearchObject(nex_datastore_super_mario_maker.SuggestedCourseSearchObject) - datastoreSMMProtocol.UploadCourseRecord(nex_datastore_super_mario_maker.UploadCourseRecord) - datastoreSMMProtocol.GetCourseRecord(nex_datastore_super_mario_maker.GetCourseRecord) - datastoreSMMProtocol.GetApplicationConfigString(nex_datastore_super_mario_maker.GetApplicationConfigString) - datastoreSMMProtocol.GetDeletionReason(nex_datastore_super_mario_maker.GetDeletionReason) - datastoreSMMProtocol.GetMetasWithCourseRecord(nex_datastore_super_mario_maker.GetMetasWithCourseRecord) - datastoreSMMProtocol.CheckRateCustomRankingCounter(nex_datastore_super_mario_maker.CheckRateCustomRankingCounter) - datastoreSMMProtocol.CTRPickUpCourseSearchObject(nex_datastore_super_mario_maker.CTRPickUpCourseSearchObject) - messageDeliveryProtocol := message_delivery.NewProtocol(globals.SecureServer) messageDeliveryProtocol.DeliverMessage(nex_message_delivery.DeliverMessage) diff --git a/nex/secure.go b/nex/secure.go index 9ffd66d..894b771 100644 --- a/nex/secure.go +++ b/nex/secure.go @@ -12,7 +12,7 @@ func StartSecureServer() { globals.SecureServer = nex.NewServer() globals.SecureServer.SetPRUDPVersion(1) globals.SecureServer.SetPRUDPProtocolMinorVersion(2) - globals.SecureServer.SetDefaultNEXVersion(nex.NewNEXVersion(3, 8, 3)) + globals.SecureServer.SetDefaultNEXVersion(nex.NewPatchedNEXVersion(3, 8, 3, "AMAJ")) globals.SecureServer.SetKerberosPassword(globals.KerberosPassword) globals.SecureServer.SetAccessKey("9f2b4678") From 7c51aab18098dbb81f3bb617b28d6759f5374f50 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Wed, 1 Nov 2023 09:24:22 -0400 Subject: [PATCH 28/28] removed unused code and comment from GetCustomRankingsByDataIDs --- .../get_custom_rankings_by_data_ids.go | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go b/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go index 40b67f0..12d68f4 100644 --- a/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go +++ b/database/datastore/super-mario-maker/get_custom_rankings_by_data_ids.go @@ -72,35 +72,5 @@ func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datas results = append(results, result) } - /* - itemList := []int{1, 3, 2, 3, 2, 1} - data := []map[string]int{ - {"id": 1}, - {"id": 3}, - {"id": 2}, - } - - itemMap := map[int]map[string]int{} - for _, v := range data { - itemMap[v["id"]] = map[string]int{ - "id": v["id"], - } - } - - output := []map[string]int{} - for _, v := range itemList { - output = append(output, itemMap[v]) - } - - fmt.Println(itemMap) // map[1:map[id:1] 2:map[id:2] 3:map[id:3]] - fmt.Println(output) // [map[id:1] map[id:3] map[id:2] map[id:3] map[id:2] map[id:1]] - */ - // * This is done because the SQL query will remove duplicates, - // * meaning if a DataID is present more than once in the input - // * it will only appear once in the output. This is wrong, all - // * inputs, including duplicates, should appear in the output. - // * - // * This will create a map of all - return results }