Merge pull request #15 from TraceEntertains/master
Some checks are pending
Build and Publish Docker Image / build-publish (push) Waiting to run

Update to nex-go v2 libraries
This commit is contained in:
William Oldham 2025-02-22 13:01:35 +00:00 committed by GitHub
commit a458ecd583
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
62 changed files with 971 additions and 1293 deletions

View File

@ -4,7 +4,7 @@ ARG app_dir="/home/go/app"
# * Building the application
FROM golang:1.22-alpine3.20 AS build
FROM golang:1.23-alpine3.20 AS build
ARG app_dir
WORKDIR ${app_dir}

View File

@ -55,7 +55,6 @@ All configuration options are handled via environment variables
| `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 |

View File

@ -4,7 +4,7 @@ import (
"database/sql"
"os"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
"github.com/PretendoNetwork/super-mario-maker/globals"
_ "github.com/lib/pq"
)

View File

@ -1,23 +1,24 @@
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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func DeleteObjectByDataID(dataID uint64) uint32 {
errCode := IsObjectAvailable(dataID)
if errCode != 0 {
return errCode
func DeleteObjectByDataID(dataID types.UInt64) *nex.Error {
nexError := IsObjectAvailable(dataID)
if nexError != nil {
return nexError
}
_, 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 nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -4,27 +4,25 @@ 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/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/lib/pq"
)
func GetObjectInfoByDataID(dataID uint64) (*datastore_types.DataStoreMetaInfo, uint32) {
errCode := IsObjectAvailable(dataID)
if errCode != 0 {
return nil, errCode
func GetObjectInfoByDataID(dataID types.UInt64) (datastore_types.DataStoreMetaInfo, *nex.Error) {
nexError := IsObjectAvailable(dataID)
if nexError != nil {
return datastore_types.NewDataStoreMetaInfo(), nexError
}
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)
metaInfo.ExpireTime = types.NewDateTime(0x9C3F3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends
metaInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
var createdDate time.Time
var updatedDate time.Time
@ -67,18 +65,18 @@ func GetObjectInfoByDataID(dataID uint64) (*datastore_types.DataStoreMetaInfo, u
if err != nil {
if err == sql.ErrNoRows {
return nil, nex.Errors.DataStore.NotFound
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
ratings, errCode := GetObjectRatingsWithSlotByDataID(metaInfo.DataID)
if errCode != 0 {
return nil, errCode
ratings, nexError := GetObjectRatingsWithSlotByDataID(metaInfo.DataID)
if nexError != nil {
return datastore_types.NewDataStoreMetaInfo(), nexError
}
metaInfo.Ratings = ratings
@ -87,5 +85,5 @@ func GetObjectInfoByDataID(dataID uint64) (*datastore_types.DataStoreMetaInfo, u
metaInfo.UpdatedTime.FromTimestamp(updatedDate)
metaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does
return metaInfo, 0
return metaInfo, nil
}

View File

@ -4,27 +4,25 @@ 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/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/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
func GetObjectInfoByDataIDWithPassword(dataID, password types.UInt64) (datastore_types.DataStoreMetaInfo, *nex.Error) {
nexError := IsObjectAvailableWithPassword(dataID, password)
if nexError != nil {
return datastore_types.NewDataStoreMetaInfo(), nexError
}
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)
metaInfo.ExpireTime = types.NewDateTime(0x9C3F3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends
metaInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
var createdDate time.Time
var updatedDate time.Time
@ -67,17 +65,17 @@ func GetObjectInfoByDataIDWithPassword(dataID uint64, password uint64) (*datasto
if err != nil {
if err == sql.ErrNoRows {
return nil, nex.Errors.DataStore.NotFound
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.NotFound, err.Error())
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
ratings, errCode := GetObjectRatingsWithSlotByDataIDWithPassword(metaInfo.DataID, password)
if errCode != 0 {
return nil, errCode
ratings, nexError := GetObjectRatingsWithSlotByDataIDWithPassword(metaInfo.DataID, password)
if nexError != nil {
return datastore_types.NewDataStoreMetaInfo(), nexError
}
metaInfo.Ratings = ratings
@ -86,5 +84,5 @@ func GetObjectInfoByDataIDWithPassword(dataID uint64, password uint64) (*datasto
metaInfo.UpdatedTime.FromTimestamp(updatedDate)
metaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does
return metaInfo, 0
return metaInfo, nil
}

View File

@ -4,24 +4,22 @@ 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/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/lib/pq"
)
func GetObjectInfoByPersistenceTargetWithPassword(persistenceTarget *datastore_types.DataStorePersistenceTarget, password uint64) (*datastore_types.DataStoreMetaInfo, uint32) {
func GetObjectInfoByPersistenceTargetWithPassword(persistenceTarget datastore_types.DataStorePersistenceTarget, password types.UInt64) (datastore_types.DataStoreMetaInfo, *nex.Error) {
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)
metaInfo.ExpireTime = types.NewDateTime(0x9C3F3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends
metaInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
var accessPassword uint64
var accessPassword types.UInt64
var underReview bool
var createdDate time.Time
var updatedDate time.Time
@ -68,27 +66,27 @@ func GetObjectInfoByPersistenceTargetWithPassword(persistenceTarget *datastore_t
if err != nil {
if err == sql.ErrNoRows {
return nil, nex.Errors.DataStore.NotFound
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if accessPassword != 0 && accessPassword != password {
return nil, nex.Errors.DataStore.InvalidPassword
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.InvalidPassword, "Invalid password")
}
if underReview {
return nil, nex.Errors.DataStore.UnderReviewing
return datastore_types.NewDataStoreMetaInfo(), nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is currently under review")
}
ratings, errCode := GetObjectRatingsWithSlotByDataIDWithPassword(metaInfo.DataID, password)
if errCode != 0 {
ratings, nexError := GetObjectRatingsWithSlotByDataIDWithPassword(metaInfo.DataID, password)
if nexError != nil {
globals.Logger.Errorf("Failed to get ratings for object %d with password %d", metaInfo.DataID, password)
return nil, errCode
return datastore_types.NewDataStoreMetaInfo(), nexError
}
metaInfo.Ratings = ratings
@ -97,5 +95,5 @@ func GetObjectInfoByPersistenceTargetWithPassword(persistenceTarget *datastore_t
metaInfo.UpdatedTime.FromTimestamp(updatedDate)
metaInfo.ReferredTime.FromTimestamp(createdDate) // * This is what the real server does
return metaInfo, 0
return metaInfo, nil
}

View File

@ -3,24 +3,25 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetObjectOwnerByDataID(dataID uint64) (uint32, uint32) {
func GetObjectOwnerByDataID(dataID types.UInt64) (uint32, *nex.Error) {
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
return 0, nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return 0, nex.Errors.DataStore.Unknown
return 0, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return owner, 0
return owner, nil
}

View File

@ -3,30 +3,31 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetObjectRatingsWithSlotByDataID(dataID uint64) ([]*datastore_types.DataStoreRatingInfoWithSlot, uint32) {
errCode := IsObjectAvailable(dataID)
if errCode != 0 {
return nil, errCode
func GetObjectRatingsWithSlotByDataID(dataID types.UInt64) ([]datastore_types.DataStoreRatingInfoWithSlot, *nex.Error) {
nexError := IsObjectAvailable(dataID)
if nexError != nil {
return nil, nexError
}
ratings := make([]*datastore_types.DataStoreRatingInfoWithSlot, 0)
ratings := types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
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
return nil, nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
defer rows.Close()
@ -40,7 +41,7 @@ func GetObjectRatingsWithSlotByDataID(dataID uint64) ([]*datastore_types.DataSto
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
ratings = append(ratings, rating)
@ -49,8 +50,8 @@ func GetObjectRatingsWithSlotByDataID(dataID uint64) ([]*datastore_types.DataSto
if err := rows.Err(); err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return ratings, 0
return ratings, nil
}

View File

@ -3,30 +3,31 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetObjectRatingsWithSlotByDataIDWithPassword(dataID uint64, password uint64) ([]*datastore_types.DataStoreRatingInfoWithSlot, uint32) {
errCode := IsObjectAvailableWithPassword(dataID, password)
if errCode != 0 {
return nil, errCode
func GetObjectRatingsWithSlotByDataIDWithPassword(dataID, password types.UInt64) ([]datastore_types.DataStoreRatingInfoWithSlot, *nex.Error) {
nexError := IsObjectAvailableWithPassword(dataID, password)
if nexError != nil {
return nil, nexError
}
ratings := make([]*datastore_types.DataStoreRatingInfoWithSlot, 0)
ratings := types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
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
return nil, nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
defer rows.Close()
@ -40,7 +41,7 @@ func GetObjectRatingsWithSlotByDataIDWithPassword(dataID uint64, password uint64
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
ratings = append(ratings, rating)
@ -49,8 +50,8 @@ func GetObjectRatingsWithSlotByDataIDWithPassword(dataID uint64, password uint64
if err := rows.Err(); err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return ratings, 0
return ratings, nil
}

View File

@ -3,24 +3,25 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetObjectSizeDataID(dataID uint64) (uint32, uint32) {
func GetObjectSizeByDataID(dataID types.UInt64) (uint32, *nex.Error) {
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
return 0, nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return 0, nex.Errors.DataStore.Unknown
return 0, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return size, 0
return size, nil
}

View File

@ -3,18 +3,18 @@ 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/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/lib/pq"
)
func InitializeObjectByPreparePostParam(ownerPID uint32, param *datastore_types.DataStorePreparePostParam) (uint64, uint32) {
now := time.Now()
func InitializeObjectByPreparePostParam(ownerPID types.PID, param datastore_types.DataStorePreparePostParam) (uint64, *nex.Error) {
var dataID uint64
now := time.Now()
err := database.Postgres.QueryRow(`INSERT INTO datastore.objects (
owner,
size,
@ -74,8 +74,8 @@ func InitializeObjectByPreparePostParam(ownerPID uint32, param *datastore_types.
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return 0, nex.Errors.DataStore.Unknown
return 0, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return dataID, 0
return dataID, nil
}

View File

@ -1,13 +1,13 @@
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"
"github.com/PretendoNetwork/nex-go/v2"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func InitializeObjectRatingWithSlot(dataID uint64, param *datastore_types.DataStoreRatingInitParamWithSlot) uint32 {
func InitializeObjectRatingWithSlot(dataID uint64, param datastore_types.DataStoreRatingInitParamWithSlot) *nex.Error {
_, err := database.Postgres.Exec(`INSERT INTO datastore.object_ratings (
data_id,
slot,
@ -49,8 +49,8 @@ func InitializeObjectRatingWithSlot(dataID uint64, param *datastore_types.DataSt
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -3,28 +3,29 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func IsObjectAvailable(dataID uint64) uint32 {
func IsObjectAvailable(dataID types.UInt64) *nex.Error {
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
return nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if underReview {
return nex.Errors.DataStore.UnderReviewing
return nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is currently under review")
}
return 0
return nil
}

View File

@ -3,14 +3,15 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func IsObjectAvailableWithPassword(dataID, password uint64) uint32 {
func IsObjectAvailableWithPassword(dataID, password types.UInt64) *nex.Error {
var underReview bool
var accessPassword uint64
var accessPassword types.UInt64
err := database.Postgres.QueryRow(`SELECT
under_review,
@ -22,21 +23,21 @@ func IsObjectAvailableWithPassword(dataID, password uint64) uint32 {
if err != nil {
if err == sql.ErrNoRows {
return nex.Errors.DataStore.NotFound
return nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if accessPassword != 0 && accessPassword != password {
return nex.Errors.DataStore.InvalidPassword
return nex.NewError(nex.ResultCodes.DataStore.InvalidPassword, "Invalid password")
}
if underReview {
return nex.Errors.DataStore.UnderReviewing
return nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is currently under review")
}
return 0
return nil
}

View File

@ -3,16 +3,17 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/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
func RateObjectWithPassword(dataID types.UInt64, slot types.UInt8, ratingValue types.Int32, accessPassword types.UInt64) (datastore_types.DataStoreRatingInfo, *nex.Error) {
nexError := IsObjectAvailableWithPassword(dataID, accessPassword)
if nexError != nil {
return datastore_types.NewDataStoreRatingInfo(), nexError
}
rating := datastore_types.NewDataStoreRatingInfo()
@ -34,13 +35,13 @@ func RateObjectWithPassword(dataID uint64, slot uint8, ratingValue int32, access
// * to the check at the start of the function.
// * This is an invalid argument
if err == sql.ErrNoRows {
return nil, nex.Errors.DataStore.InvalidArgument
return datastore_types.NewDataStoreRatingInfo(), nex.NewError(nex.ResultCodes.DataStore.InvalidArgument, "Invalid argument")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return datastore_types.NewDataStoreRatingInfo(), nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return rating, 0
return rating, nil
}

View File

@ -3,36 +3,37 @@ 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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
)
func GetBufferQueuesByDataIDAndSlot(dataID uint64, slot uint32) ([][]byte, uint32) {
errCode := datastore_db.IsObjectAvailable(dataID)
if errCode != 0 {
return nil, errCode
func GetBufferQueuesByDataIDAndSlot(dataID types.UInt64, slot types.UInt32) (types.List[types.QBuffer], *nex.Error) {
nexError := datastore_db.IsObjectAvailable(dataID)
if nexError != nil {
return nil, nexError
}
bufferQueues := make([][]byte, 0)
bufferQueues := types.NewList[types.QBuffer]()
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
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
defer rows.Close()
for rows.Next() {
var buffer []byte
var buffer types.QBuffer
err := rows.Scan(&buffer)
if err != nil {
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
bufferQueues = append(bufferQueues, buffer)
@ -40,8 +41,8 @@ func GetBufferQueuesByDataIDAndSlot(dataID uint64, slot uint32) ([][]byte, uint3
if err := rows.Err(); err != nil {
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return bufferQueues, 0
return bufferQueues, nil
}

View File

@ -4,25 +4,23 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/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
func GetCourseRecordByDataIDAndSlot(dataID types.UInt64, slot types.UInt8) (datastore_super_mario_maker_types.DataStoreGetCourseRecordResult, *nex.Error) {
nexError := datastore_db.IsObjectAvailable(dataID)
if nexError != nil {
return datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult(), nexError
}
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
@ -45,16 +43,16 @@ func GetCourseRecordByDataIDAndSlot(dataID uint64, slot uint8) (*datastore_super
if err != nil {
if err == sql.ErrNoRows {
return nil, nex.Errors.DataStore.NotFound
return datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult(), nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return datastore_super_mario_maker_types.NewDataStoreGetCourseRecordResult(), nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
courseRecord.CreatedTime.FromTimestamp(createdDate)
courseRecord.UpdatedTime.FromTimestamp(updatedDate)
return courseRecord, 0
return courseRecord, nil
}

View File

@ -3,21 +3,22 @@ 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/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/lib/pq"
)
func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datastore_super_mario_maker_types.DataStoreCustomRankingResult {
func GetCustomRankingsByDataIDs(applicationID types.UInt32, dataIDs types.List[types.UInt64]) types.List[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))
results := make(types.List[datastore_super_mario_maker_types.DataStoreCustomRankingResult], 0, len(dataIDs))
// * Using UNNEST and WITH ORDINALITY because the input
// * array may contain duplicate DataIDs. These duplicate
@ -48,8 +49,8 @@ func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datas
defer rows.Close()
for rows.Next() {
var dataID uint64
var value uint32
var dataID types.UInt64
var value types.UInt32
err := rows.Scan(&dataID, &value)
if err != nil {
@ -57,9 +58,9 @@ func GetCustomRankingsByDataIDs(applicationID uint32, dataIDs []uint64) []*datas
continue
}
objectInfo, errCode := datastore_db.GetObjectInfoByDataID(dataID)
if errCode != 0 {
globals.Logger.Errorf("Got error code %d for object %d", errCode, dataID)
objectInfo, nexError := datastore_db.GetObjectInfoByDataID(dataID)
if nexError != nil {
globals.Logger.Errorf("Got error code %d for object %d", nexError.ResultCode, dataID)
continue
}

View File

@ -4,17 +4,18 @@ 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/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/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)
func GetRandomCoursesWithLimit(limit int) (types.List[datastore_super_mario_maker_types.DataStoreCustomRankingResult], *nex.Error) {
courses := types.NewList[datastore_super_mario_maker_types.DataStoreCustomRankingResult]()
rows, err := database.Postgres.Query(`
SELECT
@ -49,12 +50,12 @@ func GetRandomCoursesWithLimit(limit int) ([]*datastore_super_mario_maker_types.
if err != nil {
if err == sql.ErrNoRows {
return nil, nex.Errors.DataStore.NotFound
return nil, nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
defer rows.Close()
@ -65,11 +66,8 @@ func GetRandomCoursesWithLimit(limit int) ([]*datastore_super_mario_maker_types.
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)
course.MetaInfo.ExpireTime = types.NewDateTime(0x9C3F3E0000) // * 9999-12-31T00:00:00.000Z. This is what the real server sends
course.MetaInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
var createdDate time.Time
var updatedDate time.Time
@ -98,9 +96,9 @@ func GetRandomCoursesWithLimit(limit int) ([]*datastore_super_mario_maker_types.
continue
}
ratings, errCode := datastore_db.GetObjectRatingsWithSlotByDataID(course.MetaInfo.DataID)
if errCode != 0 {
return nil, errCode
ratings, nexError := datastore_db.GetObjectRatingsWithSlotByDataID(course.MetaInfo.DataID)
if nexError != nil {
return nil, nexError
}
course.MetaInfo.Ratings = ratings
@ -112,5 +110,5 @@ func GetRandomCoursesWithLimit(limit int) ([]*datastore_super_mario_maker_types.
courses = append(courses, course)
}
return courses, 0
return courses, nil
}

View File

@ -3,14 +3,15 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetUserCourseObjectIDs(ownerPID uint32) ([]uint64, uint32) {
courseObjectIDs := make([]uint64, 0)
func GetUserCourseObjectIDs(ownerPID types.PID) (types.List[types.UInt64], *nex.Error) {
courseObjectIDs := types.NewList[types.UInt64]()
// * Course objects seem to have data types > 2 and < 50.
// * Data type 1 seems to be reserved for "maker" objects.
@ -23,13 +24,13 @@ func GetUserCourseObjectIDs(ownerPID uint32) ([]uint64, uint32) {
// * No rows is allowed
if err != nil && err != sql.ErrNoRows {
globals.Logger.Error(err.Error())
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
defer rows.Close()
for rows.Next() {
var dataID uint64
var dataID types.UInt64
err := rows.Scan(&dataID)
if err != nil {
@ -37,8 +38,8 @@ func GetUserCourseObjectIDs(ownerPID uint32) ([]uint64, uint32) {
continue
}
errCode := datastore_db.IsObjectAvailable(dataID)
if errCode != 0 {
nexError := datastore_db.IsObjectAvailable(dataID)
if nexError != nil {
continue
}
@ -47,8 +48,8 @@ func GetUserCourseObjectIDs(ownerPID uint32) ([]uint64, uint32) {
if err := rows.Err(); err != nil {
// TODO - Send more specific errors?
return nil, nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return courseObjectIDs, 0
return courseObjectIDs, nil
}

View File

@ -3,17 +3,18 @@ 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/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_smm_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/lib/pq"
)
func InitializeObjectByAttachFileParam(ownerPID uint32, param *datastore_smm_types.DataStoreAttachFileParam) (uint64, uint32) {
func InitializeObjectByAttachFileParam(ownerPID types.PID, param datastore_smm_types.DataStoreAttachFileParam) (types.UInt64, *nex.Error) {
now := time.Now()
var dataID uint64
var dataID types.UInt64
err := database.Postgres.QueryRow(`INSERT INTO datastore.objects (
owner,
@ -74,8 +75,8 @@ func InitializeObjectByAttachFileParam(ownerPID uint32, param *datastore_smm_typ
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return 0, nex.Errors.DataStore.Unknown
return types.NewUInt64(0), nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return dataID, 0
return dataID, nil
}

View File

@ -4,14 +4,16 @@ import (
"log"
"time"
"github.com/PretendoNetwork/super-mario-maker-secure/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
)
func InsertOrUpdateBufferQueueData(dataID uint64, slot uint32, buffer []byte) uint32 {
errCode := datastore_db.IsObjectAvailable(dataID)
if errCode != 0 {
return errCode
func InsertOrUpdateBufferQueueData(dataID types.UInt64, slot types.UInt32, buffer types.QBuffer) *nex.Error {
nexError := datastore_db.IsObjectAvailable(dataID)
if nexError != nil {
return nexError
}
now := time.Now()
@ -38,5 +40,5 @@ func InsertOrUpdateBufferQueueData(dataID uint64, slot uint32, buffer []byte) ui
log.Fatal(err)
}
return 0
return nil
}

View File

@ -3,17 +3,18 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/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
func InsertOrUpdateCourseRecord(dataID types.UInt64, slot types.UInt8, pid types.PID, score types.Int32) *nex.Error {
nexError := datastore_db.IsObjectAvailable(dataID)
if nexError != nil {
globals.Logger.Errorf("Error code %d", nexError.ResultCode)
return nexError
}
now := time.Now()
@ -50,8 +51,8 @@ func InsertOrUpdateCourseRecord(dataID uint64, slot uint8, pid uint32, score int
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -1,17 +1,18 @@
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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/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
func InsertOrUpdateCustomRanking(dataID types.UInt64, applicationID, score types.UInt32) *nex.Error {
nexError := datastore_db.IsObjectAvailable(dataID)
if nexError != nil {
globals.Logger.Errorf("Error code %d", nexError.ResultCode)
return nexError
}
_, err := database.Postgres.Exec(`INSERT INTO datastore.object_custom_rankings (
@ -31,8 +32,8 @@ func InsertOrUpdateCustomRanking(dataID uint64, applicationID, score uint32) uin
if err != nil {
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -3,13 +3,14 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func UpdateObjectDataTypeByDataIDWithPassword(dataID uint64, dataType uint16, password uint64) uint32 {
var updatePassword uint64
func UpdateObjectDataTypeByDataIDWithPassword(dataID types.UInt64, dataType types.UInt16, password types.UInt64) *nex.Error {
var updatePassword types.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(
@ -19,29 +20,29 @@ func UpdateObjectDataTypeByDataIDWithPassword(dataID uint64, dataType uint16, pa
if err != nil {
if err == sql.ErrNoRows {
return nex.Errors.DataStore.NotFound
return nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if updatePassword != 0 && updatePassword != password {
return nex.Errors.DataStore.InvalidPassword
return nex.NewError(nex.ResultCodes.DataStore.InvalidPassword, "Invalid password")
}
if underReview {
return nex.Errors.DataStore.UnderReviewing
return nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is under review")
}
_, 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 nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -3,13 +3,14 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func UpdateObjectMetaBinaryByDataIDWithPassword(dataID uint64, metaBinary []byte, password uint64) uint32 {
var updatePassword uint64
func UpdateObjectMetaBinaryByDataIDWithPassword(dataID types.UInt64, metaBinary types.QBuffer, password types.UInt64) *nex.Error {
var updatePassword types.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(
@ -19,29 +20,29 @@ func UpdateObjectMetaBinaryByDataIDWithPassword(dataID uint64, metaBinary []byte
if err != nil {
if err == sql.ErrNoRows {
return nex.Errors.DataStore.NotFound
return nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if updatePassword != 0 && updatePassword != password {
return nex.Errors.DataStore.InvalidPassword
return nex.NewError(nex.ResultCodes.DataStore.InvalidPassword, "Invalid password")
}
if underReview {
return nex.Errors.DataStore.UnderReviewing
return nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is under review")
}
_, 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 nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -3,13 +3,14 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func UpdateObjectPeriodByDataIDWithPassword(dataID uint64, period uint16, password uint64) uint32 {
var updatePassword uint64
func UpdateObjectPeriodByDataIDWithPassword(dataID types.UInt64, period types.UInt16, password types.UInt64) *nex.Error {
var updatePassword types.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(
@ -19,29 +20,29 @@ func UpdateObjectPeriodByDataIDWithPassword(dataID uint64, period uint16, passwo
if err != nil {
if err == sql.ErrNoRows {
return nex.Errors.DataStore.NotFound
return nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if updatePassword != 0 && updatePassword != password {
return nex.Errors.DataStore.InvalidPassword
return nex.NewError(nex.ResultCodes.DataStore.InvalidPassword, "Invalid password")
}
if underReview {
return nex.Errors.DataStore.UnderReviewing
return nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is under review")
}
_, 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 nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -3,36 +3,37 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func UpdateObjectUploadCompletedByDataID(dataID uint64, uploadCompleted bool) uint32 {
func UpdateObjectUploadCompletedByDataID(dataID types.UInt64, uploadCompleted bool) *nex.Error {
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
return nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
globals.Logger.Error(err.Error())
// TODO - Send more specific errors?
return nex.Errors.DataStore.Unknown
return nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
if underReview {
return nex.Errors.DataStore.UnderReviewing
return nex.NewError(nex.ResultCodes.DataStore.UnderReviewing, "This object is under review")
}
_, 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 nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
return 0
return nil
}

View File

@ -4,7 +4,7 @@ import (
"os"
"time"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/lib/pq"
)

56
globals/accounts.go Normal file
View File

@ -0,0 +1,56 @@
package globals
import (
"strconv"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
)
var AuthenticationServerAccount *nex.Account
var SecureServerAccount *nex.Account
func AccountDetailsByPID(pid types.PID) (*nex.Account, *nex.Error) {
if pid.Equals(AuthenticationServerAccount.PID) {
return AuthenticationServerAccount, nil
}
if pid.Equals(SecureServerAccount.PID) {
return SecureServerAccount, nil
}
password, errorCode := PasswordFromPID(pid)
if errorCode != 0 {
return nil, nex.NewError(errorCode, "Failed to get password from PID")
}
account := nex.NewAccount(pid, strconv.Itoa(int(pid)), password)
return account, nil
}
func AccountDetailsByUsername(username string) (*nex.Account, *nex.Error) {
if username == AuthenticationServerAccount.Username {
return AuthenticationServerAccount, nil
}
if username == SecureServerAccount.Username {
return SecureServerAccount, nil
}
pidInt, err := strconv.Atoi(username)
if err != nil {
return nil, nex.NewError(nex.ResultCodes.RendezVous.InvalidUsername, "Invalid username")
}
pid := types.NewPID(uint64(pidInt))
password, errorCode := PasswordFromPID(pid)
if errorCode != 0 {
return nil, nex.NewError(errorCode, "Failed to get password from PID")
}
account := nex.NewAccount(pid, username, password)
return account, nil
}

View File

@ -1,21 +1,24 @@
package globals
import (
"github.com/PretendoNetwork/nex-go"
pb "github.com/PretendoNetwork/grpc/go/account"
"github.com/PretendoNetwork/nex-go/v2"
datastorecommon "github.com/PretendoNetwork/nex-protocols-common-go/v2/datastore"
"github.com/PretendoNetwork/plogger-go"
"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()
var Logger *plogger.Logger
var KerberosPassword = "password" // * Default password
var AuthenticationServer *nex.Server
var SecureServer *nex.Server
var MinIOClient *minio.Client
var Presigner *S3Presigner
var AuthenticationServer *nex.PRUDPServer
var AuthenticationEndpoint *nex.PRUDPEndPoint
var SecureServer *nex.PRUDPServer
var SecureEndpoint *nex.PRUDPEndPoint
var DatastoreCommon *datastorecommon.CommonProtocol
var GRPCAccountClientConnection *grpc.ClientConn
var GRPCAccountClient pb.AccountClient
var GRPCAccountCommonMetadata metadata.MD
var MinIOClient *minio.Client
var Presigner *S3Presigner

View File

@ -3,19 +3,20 @@ package globals
import (
"context"
pb "github.com/PretendoNetwork/grpc-go/account"
"github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/nex-protocols-go/globals"
pb "github.com/PretendoNetwork/grpc/go/account"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
"github.com/PretendoNetwork/nex-protocols-go/v2/globals"
"google.golang.org/grpc/metadata"
)
func PasswordFromPID(pid uint32) (string, uint32) {
func PasswordFromPID(pid types.PID) (string, uint32) {
ctx := metadata.NewOutgoingContext(context.Background(), GRPCAccountCommonMetadata)
response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: pid})
response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: uint32(pid)})
if err != nil {
globals.Logger.Error(err.Error())
return "", nex.Errors.RendezVous.InvalidUsername
return "", nex.ResultCodes.RendezVous.InvalidUsername
}
return response.Password, 0

View File

@ -1,40 +0,0 @@
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
}

28
go.mod
View File

@ -1,43 +1,40 @@
module github.com/PretendoNetwork/super-mario-maker-secure
module github.com/PretendoNetwork/super-mario-maker
go 1.22.0
go 1.23.0
toolchain go1.23.5
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.30
github.com/PretendoNetwork/nex-protocols-go v1.0.58
github.com/PretendoNetwork/plogger-go v1.0.4
github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d
github.com/PretendoNetwork/nex-go/v2 v2.1.2
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1
github.com/PretendoNetwork/plogger-go v1.1.0
github.com/joho/godotenv v1.5.1
github.com/lib/pq v1.10.9
github.com/minio/minio-go/v7 v7.0.84
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c
google.golang.org/grpc v1.70.0
)
require (
github.com/dolthub/maphash v0.1.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/uuid v1.6.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.11 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/lxzan/gws v1.8.8 // indirect
github.com/mattn/go-colorable v0.1.14 // 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
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/rasky/go-lzo v0.0.0-20200203143853-96a758eda86e // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/superwhiskers/crunch/v3 v3.5.7 // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
golang.org/x/mod v0.23.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/sys v0.30.0 // indirect
@ -45,5 +42,4 @@ require (
golang.org/x/text v0.22.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/protobuf v1.36.4 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
)

123
go.sum
View File

@ -1,142 +1,99 @@
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.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=
github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d h1:i/XyhbTm/j8UfCSnA0Cwrvc0mWOPIftOVrfSYqbh8Xo=
github.com/PretendoNetwork/grpc/go v0.0.0-20250123103241-5fb484bf544d/go.mod h1:L6We4KkcQeiQVPrF7iu8Zax0B1Bm0v4nssR1JOAiRFQ=
github.com/PretendoNetwork/nex-go/v2 v2.1.2 h1:OJFAS6U6VNzZ4YzteKqUEZ5aJMwWIHODeRrLwNbN7nw=
github.com/PretendoNetwork/nex-go/v2 v2.1.2/go.mod h1:3LyJzsv3AataJW8D0binp15Q8ZH22MWTYly1VNtXi64=
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2 h1:rBJNZDJ92pa9fU3Og0sanyizJTWnELPoGR0Tjz8zlws=
github.com/PretendoNetwork/nex-protocols-common-go/v2 v2.2.2/go.mod h1:iuNMuBK/zww+44d6ajfLsOusXx/6Llj3zSkmhJwMuuM=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1 h1:/dsuP0W7bZNvrXoXH0ZRdxpxonfbWmmson51WCQdpEQ=
github.com/PretendoNetwork/nex-protocols-go/v2 v2.2.1/go.mod h1:+soBHmwX6ixGxj6cphLuCvfJqxcZPuowc/5e7Qi9Bz0=
github.com/PretendoNetwork/plogger-go v1.1.0 h1:x2XgyeeM8zDFGy+NcIZd3SYC2fNrVWpBBbkqTejOfiM=
github.com/PretendoNetwork/plogger-go v1.1.0/go.mod h1:wpltahp91IXr9nOvWgwep8zGtUKDeCVwm+/Wa484lQ4=
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/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=
github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4=
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/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
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/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
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.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.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.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
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/lxzan/gws v1.8.8 h1:st193ZG8qN8sSw8/g/UituFhs7etmKzS7jUqhijg5wM=
github.com/lxzan/gws v1.8.8/go.mod h1:FcGeRMB7HwGuTvMLR24ku0Zx0p6RXqeKASeMc4VYgi4=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
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=
github.com/minio/minio-go/v7 v7.0.63/go.mod h1:Q6X7Qjb7WMhvG65qKf4gUgA5XaiSox74kR1uAEjxRS4=
github.com/minio/minio-go/v7 v7.0.84 h1:D1HVmAF8JF8Bpi6IU4V9vIEj+8pc+xU88EWMs2yed0E=
github.com/minio/minio-go/v7 v7.0.84/go.mod h1:57YXpvc5l3rjPdhqNrDsvVlY0qPI6UTk1bflAe+9doY=
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/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=
github.com/rasky/go-lzo v0.0.0-20200203143853-96a758eda86e h1:dCWirM5F3wMY+cmRda/B1BiPsFtmzXqV9b0hLWtVBMs=
github.com/rasky/go-lzo v0.0.0-20200203143853-96a758eda86e/go.mod h1:9leZcVcItj6m9/CfHY5Em/iBrCz7js8LcRQGTKEEv2M=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
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/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg=
github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
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/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
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/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4=
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
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=
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/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
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/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
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/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 h1:5bKytslY8ViY0Cj/ewmRtrWHW64bNF03cAatUUFCdFI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
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/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
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=
google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
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=
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=

19
init.go
View File

@ -1,14 +1,15 @@
package main
import (
"crypto/rand"
"fmt"
"os"
"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"
pb "github.com/PretendoNetwork/grpc/go/account"
"github.com/PretendoNetwork/super-mario-maker/database"
"github.com/PretendoNetwork/super-mario-maker/globals"
"github.com/joho/godotenv"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
@ -31,7 +32,6 @@ func init() {
s3SecureEnv := os.Getenv("PN_SMM_CONFIG_S3_SECURE")
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")
secureServerPort := os.Getenv("PN_SMM_SECURE_SERVER_PORT")
@ -44,12 +44,15 @@ func init() {
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 {
globals.KerberosPassword = kerberosPassword
kerberosPassword := make([]byte, 0x10)
_, err = rand.Read(kerberosPassword)
if err != nil {
globals.Logger.Error("Error generating Kerberos password")
os.Exit(0)
}
globals.KerberosPassword = string(kerberosPassword)
if strings.TrimSpace(authenticationServerPort) == "" {
globals.Logger.Error("PN_SMM_AUTHENTICATION_SERVER_PORT environment variable not set")
os.Exit(0)

View File

@ -3,7 +3,7 @@ package main
import (
"sync"
"github.com/PretendoNetwork/super-mario-maker-secure/nex"
"github.com/PretendoNetwork/super-mario-maker/nex"
)
var wg sync.WaitGroup

View File

@ -3,33 +3,41 @@ package nex
import (
"fmt"
"os"
"strconv"
nex "github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
var serverBuildString string
func StartAuthenticationServer() {
globals.AuthenticationServer = nex.NewServer()
globals.AuthenticationServer.SetPRUDPVersion(1)
globals.AuthenticationServer.SetPRUDPProtocolMinorVersion(2)
globals.AuthenticationServer.SetDefaultNEXVersion(nex.NewPatchedNEXVersion(3, 8, 3, "AMAJ"))
globals.AuthenticationServer.SetKerberosPassword(globals.KerberosPassword)
globals.AuthenticationServer.SetAccessKey("9f2b4678")
serverBuildString = "branch:origin/project/nfs build:3_10_26_2006_0"
globals.AuthenticationServer.On("Data", func(packet *nex.PacketV1) {
request := packet.RMCRequest()
globals.AuthenticationServer = nex.NewPRUDPServer()
fmt.Println("==SMM1 - Auth==")
fmt.Printf("Protocol ID: %d\n", request.ProtocolID())
fmt.Printf("Method ID: %d\n", request.MethodID())
fmt.Println("===============")
globals.AuthenticationEndpoint = nex.NewPRUDPEndPoint(1)
globals.AuthenticationEndpoint.ServerAccount = globals.AuthenticationServerAccount
globals.AuthenticationEndpoint.AccountDetailsByPID = globals.AccountDetailsByPID
globals.AuthenticationEndpoint.AccountDetailsByUsername = globals.AccountDetailsByUsername
globals.AuthenticationServer.BindPRUDPEndPoint(globals.AuthenticationEndpoint)
globals.AuthenticationServer.ByteStreamSettings.UseStructureHeader = false
globals.AuthenticationServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(3, 8, 3))
globals.AuthenticationServer.AccessKey = "9f2b4678"
globals.AuthenticationEndpoint.OnData(func(packet nex.PacketInterface) {
request := packet.RMCMessage()
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")))
port, _ := strconv.Atoi(os.Getenv("PN_SMM_AUTHENTICATION_SERVER_PORT"))
globals.AuthenticationServer.Listen(port)
}

View File

@ -1,23 +1,24 @@
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_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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func AddToBufferQueues(err error, packet nex.PacketInterface, callID uint32, params []*datastore_super_mario_maker_types.BufferQueueParam, buffers [][]byte) uint32 {
func AddToBufferQueues(err error, packet nex.PacketInterface, callID uint32, params types.List[datastore_super_mario_maker_types.BufferQueueParam], buffers types.List[types.QBuffer]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
pResults := make([]*nex.Result, 0)
pResults := types.NewList[types.QResult]()
// * The number of params and buffers CAN be allowed
// * to differ, though this doesn't appear to happen
@ -31,9 +32,9 @@ func AddToBufferQueues(err error, packet nex.PacketInterface, callID uint32, par
buffer := buffers[i]
if param.Slot == 0 {
objectInfo, errCode := datastore_db.GetObjectInfoByDataID(param.DataID)
if errCode != 0 {
return errCode
objectInfo, nexError := datastore_db.GetObjectInfoByDataID(param.DataID)
if nexError != nil {
return nil, nexError
}
// * Objects with DataType 1 are "maker" objects. When adding
@ -44,41 +45,26 @@ func AddToBufferQueues(err error, packet nex.PacketInterface, callID uint32, par
// * "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
return nil, nex.NewError(nex.ResultCodes.DataStore.PermissionDenied, "Permission denied")
}
}
errCode := datastore_smm_db.InsertOrUpdateBufferQueueData(param.DataID, param.Slot, buffer)
if errCode != 0 {
return errCode
nexError := datastore_smm_db.InsertOrUpdateBufferQueueData(param.DataID, param.Slot, buffer)
if nexError != nil {
return nil, nexError
}
pResults = append(pResults, nex.NewResultSuccess(nex.Errors.Core.Unknown)) // * Seems to ALWAYS be a success?
pResults = append(pResults, types.NewQResultSuccess(nex.ResultCodes.Core.Unknown)) // * Seems to ALWAYS be a success?
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListResult(pResults)
pResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodAddToBufferQueues
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodAddToBufferQueues, 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
return rmcResponse, nil
}

View File

@ -1,22 +1,21 @@
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"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func CheckRateCustomRankingCounter(err error, packet nex.PacketInterface, callID uint32, applicationID uint32) uint32 {
func CheckRateCustomRankingCounter(err error, packet nex.PacketInterface, callID uint32, applicationID types.UInt32) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
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
isBelowThreshold := types.NewBool(false)
switch applicationID {
case 0: // * Unknown
@ -25,29 +24,14 @@ func CheckRateCustomRankingCounter(err error, packet nex.PacketInterface, callID
globals.Logger.Warningf("Unsupported applicationID: %d", applicationID)
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteBool(isBelowThreshold)
isBelowThreshold.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodCheckRateCustomRankingCounter
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodCheckRateCustomRankingCounter, 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
return rmcResponse, nil
}

View File

@ -5,24 +5,23 @@ import (
"os"
"time"
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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func CompleteAttachFile(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreCompletePostParam) uint32 {
func CompleteAttachFile(err error, packet nex.PacketInterface, callID uint32, param datastore_types.DataStoreCompletePostParam) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// TODO - What is param.IsSuccess? Is this correct?
if !param.IsSuccess {
return nex.Errors.DataStore.InvalidArgument
return nil, nex.NewError(nex.ResultCodes.DataStore.InvalidArgument, "Invalid argument")
}
bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET")
@ -31,53 +30,38 @@ func CompleteAttachFile(err error, packet nex.PacketInterface, callID uint32, pa
objectSizeS3, err := globals.S3ObjectSize(bucket, key)
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.NotFound
return nil, nex.NewError(nex.ResultCodes.DataStore.NotFound, "Object not found")
}
objectSizeDB, errCode := datastore_db.GetObjectSizeDataID(param.DataID)
if errCode != 0 {
return errCode
objectSizeDB, nexError := datastore_db.GetObjectSizeByDataID(param.DataID)
if nexError != nil {
return nil, nexError
}
if objectSizeS3 != uint64(objectSizeDB) {
// TODO - Is this a good error?
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, "")
}
errCode = datastore_db.UpdateObjectUploadCompletedByDataID(param.DataID, true)
if errCode != 0 {
return errCode
nexError = datastore_db.UpdateObjectUploadCompletedByDataID(param.DataID, true)
if nexError != nil {
return nil, nexError
}
pURL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15)
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.OperationNotAllowed
return nil, nex.NewError(nex.ResultCodes.DataStore.OperationNotAllowed, "Operation not allowed")
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteString(pURL.String())
types.NewString(pURL.String()).WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodCompleteAttachFile
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodCompleteAttachFile, 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
return rmcResponse, nil
}

View File

@ -1,21 +1,20 @@
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_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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func CTRPickUpCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 {
func CTRPickUpCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param datastore_types.DataStoreSearchParam, extraData types.List[types.String]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// * This method is only used by the 3DS version
// * of Super Mario Maker and is functionally
// * identical to the WiiU versions
@ -31,34 +30,19 @@ func CTRPickUpCourseSearchObject(err error, packet nex.PacketInterface, callID u
// 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
pRankingResults, nexError := datastore_smm_db.GetRandomCoursesWithLimit(int(param.ResultRange.Length))
if nexError != nil {
return nil, nexError
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pRankingResults)
pRankingResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodCTRPickUpCourseSearchObject
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodCTRPickUpCourseSearchObject, 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
return rmcResponse, nil
}

View File

@ -1,23 +1,22 @@
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"
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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func FollowingsLatestCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 {
func FollowingsLatestCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param datastore_types.DataStoreSearchParam, extraData types.List[types.String]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
pRankingResults := make([]*datastore_super_mario_maker_types.DataStoreCustomRankingResult, 0)
pRankingResults := types.NewList[datastore_super_mario_maker_types.DataStoreCustomRankingResult]()
// * This seems to ONLY be used to get rankings for course objects
// * uploaded by the users in param.OwnerIDs? If param.ResultOption
@ -25,16 +24,16 @@ func FollowingsLatestCourseSearchObject(err error, packet nex.PacketInterface, c
// * 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 i := range param.OwnerIDs {
courseObjectIDs, nexError := datastore_smm_db.GetUserCourseObjectIDs(param.OwnerIDs[i])
if nexError != nil {
return nil, nexError
}
// * This method seems to always use slot 0?
results := datastore_smm_db.GetCustomRankingsByDataIDs(0, courseObjectIDs)
results := datastore_smm_db.GetCustomRankingsByDataIDs(types.NewUInt32(0), courseObjectIDs)
for _, rankingResult := range results {
for j := range results {
// * This is kind of backwards.
// * The database pulls this data
// * by default, so it can be done
@ -45,49 +44,34 @@ func FollowingsLatestCourseSearchObject(err error, packet nex.PacketInterface, c
// * is *NOT* set and conditionally
// * *REMOVE* the field
if param.ResultOption&0x1 == 0 {
rankingResult.MetaInfo.Tags = make([]string, 0)
results[j].MetaInfo.Tags = types.NewList[types.String]()
}
if param.ResultOption&0x2 == 0 {
rankingResult.MetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0)
results[j].MetaInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
}
if param.ResultOption&0x4 == 0 {
rankingResult.MetaInfo.MetaBinary = make([]byte, 0)
results[j].MetaInfo.MetaBinary = types.NewQBuffer(nil)
}
// TODO - If this flag is set, extraData is checked somehow
if param.ResultOption&0x20 == 0 {
rankingResult.Score = 0
results[j].Score = 0
}
pRankingResults = append(pRankingResults, rankingResult)
pRankingResults = append(pRankingResults, results[j])
}
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pRankingResults)
pRankingResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodFollowingsLatestCourseSearchObject
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodFollowingsLatestCourseSearchObject, 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
return rmcResponse, nil
}

View File

@ -3,9 +3,10 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
// * Nintendo sets this to 10 by default
@ -16,15 +17,13 @@ import (
// * more, but 100 is fine tbh
var MAX_COURSE_UPLOADS uint32 = 100
func GetApplicationConfig(err error, packet nex.PacketInterface, callID uint32, applicationID uint32) uint32 {
func GetApplicationConfig(err error, packet nex.PacketInterface, callID uint32, applicationID types.UInt32) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
config := make([]uint32, 0)
var config []uint32
switch applicationID {
case 0: // * Player config?
@ -39,31 +38,21 @@ func GetApplicationConfig(err error, packet nex.PacketInterface, callID uint32,
fmt.Printf("[Warning] DataStoreSMMProtocol::GetApplicationConfig Unsupported applicationID: %v\n", applicationID)
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
configNative := make(types.List[types.UInt32], 0, len(config))
for i := range config {
configNative = append(configNative, types.NewUInt32(config[i]))
}
rmcResponseStream.WriteListUInt32LE(config)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseBody := rmcResponseStream.Bytes()
configNative.WriteTo(rmcResponseStream)
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetApplicationConfig, rmcResponseBody)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetApplicationConfig
rmcResponse.CallID = callID
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
return rmcResponse, nil
}
func getApplicationConfig_PlayerConfig() []uint32 {
@ -87,7 +76,7 @@ func getApplicationConfig_PlayerConfig() []uint32 {
func getApplicationConfig_OfficialMakers() []uint32 {
// * Used as the PIDs for the "Official" makers in the "MAKERS" section
return []uint32{
2, // * Not a real user PID, this translates to the internal Quazal Rendez-Vous user used by NEX
2, // * Not a real user PID, this translates to the internal Quazal Rendez-Vous user used by NEX
1770179696, // * "official_player0" on NN, need to make PN versions
1770179664, // * "official_player1" on NN, need to make PN versions
1770179640, // * "official_player2" on NN, need to make PN versions

View File

@ -3,21 +3,20 @@ 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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetApplicationConfigString(err error, packet nex.PacketInterface, callID uint32, applicationID uint32) uint32 {
func GetApplicationConfigString(err error, packet nex.PacketInterface, callID uint32, applicationID types.UInt32) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// * Word blacklists?
config := make([]string, 0)
var config []string
switch applicationID {
case 128:
@ -30,31 +29,21 @@ func GetApplicationConfigString(err error, packet nex.PacketInterface, callID ui
fmt.Printf("[Warning] DataStoreSMMProtocol::GetApplicationConfigString Unsupported applicationID: %v\n", applicationID)
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
configNative := make(types.List[types.String], 0, len(config))
for i := range config {
configNative = append(configNative, types.NewString(config[i]))
}
rmcResponseStream.WriteListString(config)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseBody := rmcResponseStream.Bytes()
configNative.WriteTo(rmcResponseStream)
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetApplicationConfigString, rmcResponseBody)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetApplicationConfigString
rmcResponse.CallID = callID
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
return rmcResponse, nil
}
func getApplicationConfigString_WordBlacklist1() []string {

View File

@ -1,49 +1,33 @@
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_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/nex-go/v2"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetBufferQueue(err error, packet nex.PacketInterface, 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) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
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)
return errCode
pBufferQueue, nexError := datastore_smm_db.GetBufferQueuesByDataIDAndSlot(param.DataID, param.Slot)
if nexError != nil {
globals.Logger.Errorf("Error code %d for object %d", nexError.ResultCode, param.DataID)
return nil, nexError
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream.WriteListQBuffer(pBufferQueue)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseBody := rmcResponseStream.Bytes()
pBufferQueue.WriteTo(rmcResponseStream)
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetBufferQueue, rmcResponseBody)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetBufferQueue
rmcResponse.CallID = callID
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
return rmcResponse, nil
}

View File

@ -1,49 +1,32 @@
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_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/nex-go/v2"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetCourseRecord(err error, packet nex.PacketInterface, 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) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
result, errCode := datastore_smm_db.GetCourseRecordByDataIDAndSlot(param.DataID, param.Slot)
if errCode != 0 {
return errCode
result, nexError := datastore_smm_db.GetCourseRecordByDataIDAndSlot(param.DataID, param.Slot)
if nexError != nil {
return nil, nexError
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteStructure(result)
result.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetCourseRecord
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetCourseRecord, 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
return rmcResponse, nil
}

View File

@ -1,26 +1,25 @@
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"
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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetCustomRankingByDataID(err error, packet nex.PacketInterface, 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) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
pRankingResult := datastore_smm_db.GetCustomRankingsByDataIDs(param.ApplicationID, param.DataIDList)
pResults := make([]*nex.Result, 0, len(param.DataIDList))
pResults := make(types.List[types.QResult], 0, len(param.DataIDList))
for _, rankingResult := range pRankingResult {
for i := range pRankingResult {
// * This is kind of backwards.
// * The database pulls this data
// * by default, so it can be done
@ -31,51 +30,36 @@ func GetCustomRankingByDataID(err error, packet nex.PacketInterface, callID uint
// * is *NOT* set and conditionally
// * *REMOVE* the field
if param.ResultOption&0x1 == 0 {
rankingResult.MetaInfo.Tags = make([]string, 0)
pRankingResult[i].MetaInfo.Tags = types.NewList[types.String]()
}
if param.ResultOption&0x2 == 0 {
rankingResult.MetaInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0)
pRankingResult[i].MetaInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
}
if param.ResultOption&0x4 == 0 {
rankingResult.MetaInfo.MetaBinary = make([]byte, 0)
pRankingResult[i].MetaInfo.MetaBinary = types.NewQBuffer(nil)
}
if param.ResultOption&0x20 == 0 {
rankingResult.Score = 0
pRankingResult[i].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))
pResults = append(pResults, types.NewQResultSuccess(nex.ResultCodes.Core.Unknown))
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pRankingResult)
rmcResponseStream.WriteListResult(pResults)
pRankingResult.WriteTo(rmcResponseStream)
pResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetCustomRankingByDataID
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetCustomRankingByDataID, 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
return rmcResponse, nil
}

View File

@ -1,56 +1,40 @@
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"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetDeletionReason(err error, packet nex.PacketInterface, callID uint32, dataIDLst []uint64) uint32 {
func GetDeletionReason(err error, packet nex.PacketInterface, callID uint32, dataIDLst types.List[types.UInt64]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// 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)
pDeletionReasons := types.NewList[types.UInt32]()
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)
pDeletionReasons = append(pDeletionReasons, types.NewUInt32(0))
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListUInt32LE(pDeletionReasons)
pDeletionReasons.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetDeletionReason
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetDeletionReason, 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
return rmcResponse, nil
}

View File

@ -1,23 +1,22 @@
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"
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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetMetasWithCourseRecord(err error, packet nex.PacketInterface, callID uint32, params []*datastore_super_mario_maker_types.DataStoreGetCourseRecordParam, metaParam *datastore_types.DataStoreGetMetaParam) uint32 {
func GetMetasWithCourseRecord(err error, packet nex.PacketInterface, callID uint32, params types.List[datastore_super_mario_maker_types.DataStoreGetCourseRecordParam], metaParam datastore_types.DataStoreGetMetaParam) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// * The functionality here is largely a guess
// * based on how GetCourseRecord works and
// * based on testing with a custom client.
@ -25,70 +24,23 @@ func GetMetasWithCourseRecord(err error, packet nex.PacketInterface, callID uint
// * 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))
pMetaInfo := make(types.List[datastore_types.DataStoreMetaInfo], 0, len(params))
pCourseResults := make(types.List[datastore_super_mario_maker_types.DataStoreGetCourseRecordResult], 0, len(params))
pResults := make(types.List[types.QResult], 0, len(params))
for _, param := range params {
for i := 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, nexError := datastore_db.GetObjectInfoByDataID(params[i].DataID)
if nexError != nil {
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 {
nexError = globals.DatastoreCommon.VerifyObjectPermission(objectInfo.OwnerID, packet.Sender().PID(), objectInfo.Permission)
if nexError != nil {
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.
@ -101,61 +53,39 @@ func GetMetasWithCourseRecord(err error, packet nex.PacketInterface, callID uint
// * is *NOT* set and conditionally
// * *REMOVE* the field
if metaParam.ResultOption&0x1 == 0 {
objectInfo.Tags = make([]string, 0)
objectInfo.Tags = types.NewList[types.String]()
}
if metaParam.ResultOption&0x2 == 0 {
objectInfo.Ratings = make([]*datastore_types.DataStoreRatingInfoWithSlot, 0)
objectInfo.Ratings = types.NewList[datastore_types.DataStoreRatingInfoWithSlot]()
}
if metaParam.ResultOption&0x4 == 0 {
objectInfo.MetaBinary = make([]byte, 0)
objectInfo.MetaBinary = types.NewQBuffer(nil)
}
}
// * 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, nexError := datastore_smm_db.GetCourseRecordByDataIDAndSlot(params[i].DataID, params[i].Slot)
if nexError != nil || 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
pResults = append(pResults, types.NewQResultSuccess(nex.ResultCodes.Core.Unknown)) // * Real server ALWAYS returns a success
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pMetaInfo)
rmcResponseStream.WriteListStructure(pCourseResults)
rmcResponseStream.WriteListResult(pResults)
pMetaInfo.WriteTo(rmcResponseStream)
pCourseResults.WriteTo(rmcResponseStream)
pResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetMetasWithCourseRecord
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetMetasWithCourseRecord, 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
return rmcResponse, nil
}

View File

@ -5,28 +5,26 @@ import (
"os"
"time"
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"
datastore_db "github.com/PretendoNetwork/super-mario-maker-secure/database/datastore"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func GetObjectInfos(err error, packet nex.PacketInterface, callID uint32, dataIDs []uint64) uint32 {
func GetObjectInfos(err error, packet nex.PacketInterface, callID uint32, dataIDs types.List[types.UInt64]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
pInfos := types.NewList[datastore_super_mario_maker_types.DataStoreFileServerObjectInfo]()
pInfos := make([]*datastore_super_mario_maker_types.DataStoreFileServerObjectInfo, 0)
for _, dataID := range dataIDs {
objectInfo, errCode := datastore_db.GetObjectInfoByDataID(dataID)
if errCode != 0 {
return errCode
for i := range dataIDs {
objectInfo, nexError := datastore_db.GetObjectInfoByDataID(dataIDs[i])
if nexError != nil {
return nil, nexError
}
bucket := os.Getenv("PN_SMM_CONFIG_S3_BUCKET")
@ -35,44 +33,26 @@ func GetObjectInfos(err error, packet nex.PacketInterface, callID uint32, dataID
URL, err := globals.Presigner.GetObject(bucket, key, time.Minute*15)
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.OperationNotAllowed
return nil, nex.NewError(nex.ResultCodes.DataStore.OperationNotAllowed, "Operation not allowed")
}
info := datastore_super_mario_maker_types.NewDataStoreFileServerObjectInfo()
info.DataID = objectInfo.DataID
info.GetInfo = datastore_types.NewDataStoreReqGetInfo()
info.GetInfo.URL = URL.String()
info.GetInfo.RequestHeaders = []*datastore_types.DataStoreKeyValue{}
info.GetInfo.URL = types.NewString(URL.String())
info.GetInfo.Size = objectInfo.Size
info.GetInfo.RootCACert = []byte{}
info.GetInfo.DataID = objectInfo.DataID
pInfos = append(pInfos, info)
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pInfos)
pInfos.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodGetObjectInfos
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodGetObjectInfos, 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
return rmcResponse, nil
}

View File

@ -5,43 +5,42 @@ import (
"os"
"time"
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"
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"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func PrepareAttachFile(err error, packet nex.PacketInterface, 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) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
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
// * 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
dataID, nexError := datastore_smm_db.InitializeObjectByAttachFileParam(packet.Sender().PID(), param)
if nexError != nil {
globals.Logger.Errorf("Error code %d on object init", nexError.ResultCode)
return nil, nexError
}
// 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
for i := range param.PostParam.RatingInitParams {
nexError = datastore_db.InitializeObjectRatingWithSlot(uint64(dataID), param.PostParam.RatingInitParams[i])
if nexError != nil {
globals.Logger.Errorf("Error code %d on rating init", nexError.ResultCode)
return nil, nexError
}
}
@ -55,42 +54,25 @@ func PrepareAttachFile(err error, packet nex.PacketInterface, callID uint32, par
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{}
pReqPostInfo.URL = types.NewString(URL.String())
pReqPostInfo.FormFields = make(types.List[datastore_types.DataStoreKeyValue], 0, len(formData))
for key, value := range formData {
field := datastore_types.NewDataStoreKeyValue()
field.Key = key
field.Value = value
field.Key = types.NewString(key)
field.Value = types.NewString(value)
pReqPostInfo.FormFields = append(pReqPostInfo.FormFields, field)
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteStructure(pReqPostInfo)
pReqPostInfo.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodPrepareAttachFile
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodPrepareAttachFile, 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
return rmcResponse, nil
}

View File

@ -1,43 +1,29 @@
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_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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func RateCustomRanking(err error, packet nex.PacketInterface, callID uint32, params []*datastore_super_mario_maker_types.DataStoreRateCustomRankingParam) uint32 {
func RateCustomRanking(err error, packet nex.PacketInterface, callID uint32, params types.List[datastore_super_mario_maker_types.DataStoreRateCustomRankingParam]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
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)
for i := range params {
datastore_smm_db.InsertOrUpdateCustomRanking(params[i].DataID, params[i].ApplicationID, params[i].Score)
}
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodRateCustomRanking, nil)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, nil)
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodRateCustomRanking
rmcResponse.CallID = callID
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
return rmcResponse, nil
}

View File

@ -1,21 +1,20 @@
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_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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func RecommendedCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 {
func RecommendedCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param datastore_types.DataStoreSearchParam, extraData types.List[types.String]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// * This method is used in 100 Mario and Course World
// *
// * extraData seems to be a set of filters defining a
@ -45,34 +44,19 @@ func RecommendedCourseSearchObject(err error, packet nex.PacketInterface, callID
}
// TODO - Use the offet? Real client never uses it, but might be nice for completeness sake?
pRankingResults, errCode := datastore_smm_db.GetRandomCoursesWithLimit(length)
if errCode != 0 {
return errCode
pRankingResults, nexError := datastore_smm_db.GetRandomCoursesWithLimit(length)
if nexError != nil {
return nil, nexError
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pRankingResults)
pRankingResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodRecommendedCourseSearchObject
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodRecommendedCourseSearchObject, 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
return rmcResponse, nil
}

View File

@ -3,21 +3,20 @@ package nex_datastore_super_mario_maker
import (
"strconv"
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_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/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func SuggestedCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param *datastore_types.DataStoreSearchParam, extraData []string) uint32 {
func SuggestedCourseSearchObject(err error, packet nex.PacketInterface, callID uint32, param datastore_types.DataStoreSearchParam, extraData types.List[types.String]) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
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
@ -28,41 +27,26 @@ func SuggestedCourseSearchObject(err error, packet nex.PacketInterface, callID u
// * does act as a filter of some kind? Maybe it has to
// * do with difficulty? Or ratings?
_, err = strconv.ParseUint(extraData[0], 0, 64)
_, err = strconv.ParseUint(string(extraData[0]), 0, 64)
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.InvalidArgument
return nil, nex.NewError(nex.ResultCodes.DataStore.InvalidArgument, "Invalid argument")
}
// TODO - Use extraData for filtering
pRankingResults, errCode := datastore_smm_db.GetRandomCoursesWithLimit(int(param.ResultRange.Length))
if errCode != 0 {
return errCode
pRankingResults, nexError := datastore_smm_db.GetRandomCoursesWithLimit(int(param.ResultRange.Length))
if nexError != nil {
return nil, nexError
}
rmcResponseStream := nex.NewStreamOut(globals.SecureServer)
rmcResponseStream := nex.NewByteStreamOut(globals.SecureServer.LibraryVersions, globals.SecureServer.ByteStreamSettings)
rmcResponseStream.WriteListStructure(pRankingResults)
pRankingResults.WriteTo(rmcResponseStream)
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseStream.Bytes())
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodSuggestedCourseSearchObject
rmcResponse.CallID = callID
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodSuggestedCourseSearchObject, 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
return rmcResponse, nil
}

View File

@ -1,43 +1,30 @@
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_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/nex-go/v2"
datastore_super_mario_maker "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
datastore_super_mario_maker_types "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker/types"
datastore_smm_db "github.com/PretendoNetwork/super-mario-maker/database/datastore/super-mario-maker"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func UploadCourseRecord(err error, packet nex.PacketInterface, 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) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
errCode := datastore_smm_db.InsertOrUpdateCourseRecord(param.DataID, param.Slot, client.PID(), param.Score)
if errCode != 0 {
return errCode
nexError := datastore_smm_db.InsertOrUpdateCourseRecord(param.DataID, param.Slot, client.PID(), param.Score)
if nexError != nil {
return nil, nexError
}
rmcResponse := nex.NewRMCResponse(datastore_super_mario_maker.ProtocolID, callID)
rmcResponse.SetSuccess(datastore_super_mario_maker.MethodUploadCourseRecord, nil)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, nil)
rmcResponse.ProtocolID = datastore_super_mario_maker.ProtocolID
rmcResponse.MethodID = datastore_super_mario_maker.MethodUploadCourseRecord
rmcResponse.CallID = callID
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
return rmcResponse, nil
}

View File

@ -1,38 +1,24 @@
package nex_message_delivery
import (
nex "github.com/PretendoNetwork/nex-go"
message_delivery "github.com/PretendoNetwork/nex-protocols-go/message-delivery"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
message_delivery "github.com/PretendoNetwork/nex-protocols-go/v2/message-delivery"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func DeliverMessage(err error, packet nex.PacketInterface, callID uint32, oUserMessage *nex.DataHolder) uint32 {
func DeliverMessage(err error, packet nex.PacketInterface, callID uint32, oUserMessage types.DataHolder) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nex.Errors.DataStore.Unknown
return nil, nex.NewError(nex.ResultCodes.DataStore.Unknown, err.Error())
}
client := packet.Sender()
// TODO - See what this does
rmcResponse := nex.NewRMCResponse(message_delivery.ProtocolID, callID)
rmcResponse.SetSuccess(message_delivery.MethodDeliverMessage, nil)
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, nil)
rmcResponse.ProtocolID = message_delivery.ProtocolID
rmcResponse.MethodID = message_delivery.MethodDeliverMessage
rmcResponse.CallID = callID
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
return rmcResponse, nil
}

View File

@ -4,27 +4,31 @@ 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"
"github.com/PretendoNetwork/nex-go/v2/constants"
"github.com/PretendoNetwork/nex-go/v2/types"
common_ticket_granting "github.com/PretendoNetwork/nex-protocols-common-go/v2/ticket-granting"
ticket_granting "github.com/PretendoNetwork/nex-protocols-go/v2/ticket-granting"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func registerCommonAuthenticationServerProtocols() {
ticketGrantingProtocol := ticket_granting.NewCommonTicketGrantingProtocol(globals.AuthenticationServer)
ticketGrantingProtocol := ticket_granting.NewProtocol()
globals.AuthenticationEndpoint.RegisterServiceProtocol(ticketGrantingProtocol)
commonTicketGrantingProtocol := common_ticket_granting.NewCommonProtocol(ticketGrantingProtocol)
secureStationURL := nex.NewStationURL("")
secureStationURL.SetScheme("prudps")
port, _ := strconv.Atoi(os.Getenv("PN_SMM_SECURE_SERVER_PORT"))
secureStationURL := types.NewStationURL("")
secureStationURL.SetURLType(constants.StationURLPRUDPS)
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)
secureStationURL.SetPortNumber(uint16(port))
secureStationURL.SetConnectionID(1)
secureStationURL.SetPrincipalID(types.NewPID(2))
secureStationURL.SetStreamID(1)
secureStationURL.SetStreamType(constants.StreamTypeRVSecure)
secureStationURL.SetType(uint8(constants.StationURLFlagPublic))
ticketGrantingProtocol.SetSecureStationURL(secureStationURL)
ticketGrantingProtocol.SetBuildName(serverBuildString)
globals.AuthenticationServer.SetPasswordFromPIDFunction(globals.PasswordFromPID)
commonTicketGrantingProtocol.SecureStationURL = secureStationURL
commonTicketGrantingProtocol.BuildName = types.NewString(serverBuildString)
commonTicketGrantingProtocol.SecureServerAccount = globals.SecureServerAccount
}

View File

@ -3,50 +3,67 @@ 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"
"github.com/PretendoNetwork/nex-go/v2/types"
datastorecommon "github.com/PretendoNetwork/nex-protocols-common-go/v2/datastore"
securecommon "github.com/PretendoNetwork/nex-protocols-common-go/v2/secure-connection"
datastore "github.com/PretendoNetwork/nex-protocols-go/v2/datastore"
datastoresmm "github.com/PretendoNetwork/nex-protocols-go/v2/datastore/super-mario-maker"
secure "github.com/PretendoNetwork/nex-protocols-go/v2/secure-connection"
datastore_db "github.com/PretendoNetwork/super-mario-maker/database/datastore"
"github.com/PretendoNetwork/super-mario-maker/globals"
nex_datastore_super_mario_maker "github.com/PretendoNetwork/super-mario-maker/nex/datastore/super-mario-maker"
)
func registerCommonSecureProtocols() {
secureconnection.NewCommonSecureConnectionProtocol(globals.SecureServer)
secureProtocol := secure.NewProtocol()
globals.SecureEndpoint.RegisterServiceProtocol(secureProtocol)
commonSecureProtocol := securecommon.NewCommonProtocol(secureProtocol)
commonSecureProtocol.CreateReportDBRecord = func(pid types.PID, reportID types.UInt32, reportData types.QBuffer) error {
return nil
}
commonDataStoreProtocol := datastore.NewCommonDataStoreProtocol(globals.SecureServer)
datastoreProtocol := datastore.NewProtocol()
commonDataStoreProtocol := datastorecommon.NewCommonProtocol(datastoreProtocol)
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.S3Bucket = os.Getenv("PN_SMM_CONFIG_S3_BUCKET")
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)
commonDataStoreProtocol.GetObjectInfoByDataID = datastore_db.GetObjectInfoByDataID
commonDataStoreProtocol.GetObjectInfoByPersistenceTargetWithPassword = datastore_db.GetObjectInfoByPersistenceTargetWithPassword
commonDataStoreProtocol.GetObjectInfoByDataIDWithPassword = datastore_db.GetObjectInfoByDataIDWithPassword
commonDataStoreProtocol.GetObjectOwnerByDataID = datastore_db.GetObjectOwnerByDataID
commonDataStoreProtocol.GetObjectSizeByDataID = datastore_db.GetObjectSizeByDataID
commonDataStoreProtocol.UpdateObjectPeriodByDataIDWithPassword = datastore_db.UpdateObjectPeriodByDataIDWithPassword
commonDataStoreProtocol.UpdateObjectMetaBinaryByDataIDWithPassword = datastore_db.UpdateObjectMetaBinaryByDataIDWithPassword
commonDataStoreProtocol.UpdateObjectDataTypeByDataIDWithPassword = datastore_db.UpdateObjectDataTypeByDataIDWithPassword
commonDataStoreProtocol.UpdateObjectUploadCompletedByDataID = datastore_db.UpdateObjectUploadCompletedByDataID
commonDataStoreProtocol.InitializeObjectByPreparePostParam = datastore_db.InitializeObjectByPreparePostParam
commonDataStoreProtocol.InitializeObjectRatingWithSlot = datastore_db.InitializeObjectRatingWithSlot
commonDataStoreProtocol.RateObjectWithPassword = datastore_db.RateObjectWithPassword
commonDataStoreProtocol.DeleteObjectByDataID = datastore_db.DeleteObjectByDataID
globals.DatastoreCommon = commonDataStoreProtocol
smmDatastore := datastoresmm.NewProtocol(globals.SecureEndpoint)
smmDatastore.GetObjectInfos = nex_datastore_super_mario_maker.GetObjectInfos
smmDatastore.RateCustomRanking = nex_datastore_super_mario_maker.RateCustomRanking
smmDatastore.GetCustomRankingByDataID = nex_datastore_super_mario_maker.GetCustomRankingByDataID
smmDatastore.AddToBufferQueues = nex_datastore_super_mario_maker.AddToBufferQueues
smmDatastore.GetBufferQueue = nex_datastore_super_mario_maker.GetBufferQueue
smmDatastore.CompleteAttachFile = nex_datastore_super_mario_maker.CompleteAttachFile
smmDatastore.PrepareAttachFile = nex_datastore_super_mario_maker.PrepareAttachFile
smmDatastore.GetApplicationConfig = nex_datastore_super_mario_maker.GetApplicationConfig
smmDatastore.FollowingsLatestCourseSearchObject = nex_datastore_super_mario_maker.FollowingsLatestCourseSearchObject
smmDatastore.RecommendedCourseSearchObject = nex_datastore_super_mario_maker.RecommendedCourseSearchObject
smmDatastore.SuggestedCourseSearchObject = nex_datastore_super_mario_maker.SuggestedCourseSearchObject
smmDatastore.UploadCourseRecord = nex_datastore_super_mario_maker.UploadCourseRecord
smmDatastore.GetCourseRecord = nex_datastore_super_mario_maker.GetCourseRecord
smmDatastore.GetApplicationConfigString = nex_datastore_super_mario_maker.GetApplicationConfigString
smmDatastore.GetDeletionReason = nex_datastore_super_mario_maker.GetDeletionReason
smmDatastore.GetMetasWithCourseRecord = nex_datastore_super_mario_maker.GetMetasWithCourseRecord
smmDatastore.CheckRateCustomRankingCounter = nex_datastore_super_mario_maker.CheckRateCustomRankingCounter
smmDatastore.CTRPickUpCourseSearchObject = nex_datastore_super_mario_maker.CTRPickUpCourseSearchObject
}

View File

@ -1,13 +1,13 @@
package nex
import (
message_delivery "github.com/PretendoNetwork/nex-protocols-go/message-delivery"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
nex_message_delivery "github.com/PretendoNetwork/super-mario-maker-secure/nex/message-delivery"
message_delivery "github.com/PretendoNetwork/nex-protocols-go/v2/message-delivery"
"github.com/PretendoNetwork/super-mario-maker/globals"
nex_message_delivery "github.com/PretendoNetwork/super-mario-maker/nex/message-delivery"
)
func registerNEXProtocols() {
messageDeliveryProtocol := message_delivery.NewProtocol(globals.SecureServer)
messageDeliveryProtocol.DeliverMessage(nex_message_delivery.DeliverMessage)
messageDeliveryProtocol := message_delivery.NewProtocol()
messageDeliveryProtocol.DeliverMessage = nex_message_delivery.DeliverMessage
globals.SecureEndpoint.RegisterServiceProtocol(messageDeliveryProtocol)
}

View File

@ -3,31 +3,41 @@ package nex
import (
"fmt"
"os"
"strconv"
"github.com/PretendoNetwork/nex-go"
"github.com/PretendoNetwork/super-mario-maker-secure/globals"
"github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/super-mario-maker/globals"
)
func StartSecureServer() {
globals.SecureServer = nex.NewServer()
globals.SecureServer.SetPRUDPVersion(1)
globals.SecureServer.SetPRUDPProtocolMinorVersion(2)
globals.SecureServer.SetDefaultNEXVersion(nex.NewPatchedNEXVersion(3, 8, 3, "AMAJ"))
globals.SecureServer.SetKerberosPassword(globals.KerberosPassword)
globals.SecureServer.SetAccessKey("9f2b4678")
serverBuildString = "branch:origin/project/nfs build:3_10_26_2006_0"
globals.SecureServer.On("Data", func(packet *nex.PacketV1) {
request := packet.RMCRequest()
globals.SecureServer = nex.NewPRUDPServer()
fmt.Println("==SMM1 - Secure==")
fmt.Printf("Protocol ID: %d\n", request.ProtocolID())
fmt.Printf("Method ID: %d\n", request.MethodID())
fmt.Println("===============")
globals.SecureEndpoint = nex.NewPRUDPEndPoint(1)
globals.SecureEndpoint.ServerAccount = globals.SecureServerAccount
globals.SecureEndpoint.AccountDetailsByPID = globals.AccountDetailsByPID
globals.SecureEndpoint.AccountDetailsByUsername = globals.AccountDetailsByUsername
globals.SecureServer.BindPRUDPEndPoint(globals.SecureEndpoint)
globals.SecureServer.ByteStreamSettings.UseStructureHeader = false
globals.SecureServer.LibraryVersions.SetDefault(nex.NewLibraryVersion(3, 8, 3))
globals.SecureServer.AccessKey = "9f2b4678"
globals.SecureEndpoint.OnData(func(packet nex.PacketInterface) {
request := packet.RMCMessage()
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")))
port, _ := strconv.Atoi(os.Getenv("PN_SMM_SECURE_SERVER_PORT"))
globals.SecureServer.Listen(port)
}