mirror of
https://github.com/wiiu-env/ftpiiu_plugin.git
synced 2024-11-16 17:59:19 +01:00
Add a config menu to enabled/disable the server, see the ip, and enabled/disable access to system files
This commit is contained in:
parent
c40df1a909
commit
0f61c1ecfb
@ -1,6 +1,6 @@
|
|||||||
FROM wiiuenv/devkitppc:20220806
|
FROM wiiuenv/devkitppc:20220917
|
||||||
|
|
||||||
COPY --from=wiiuenv/wiiupluginsystem:20220826 /artifacts $DEVKITPRO
|
COPY --from=wiiuenv/wiiupluginsystem:20220918 /artifacts $DEVKITPRO
|
||||||
COPY --from=wiiuenv/libmocha:20220903 /artifacts $DEVKITPRO
|
COPY --from=wiiuenv/libmocha:20220919 /artifacts $DEVKITPRO
|
||||||
|
|
||||||
WORKDIR project
|
WORKDIR project
|
170
src/main.cpp
170
src/main.cpp
@ -6,20 +6,30 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <mocha/mocha.h>
|
#include <mocha/mocha.h>
|
||||||
#include <nn/ac.h>
|
#include <nn/ac.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <wups.h>
|
#include <wups.h>
|
||||||
|
#include <wups/config/WUPSConfigItemBoolean.h>
|
||||||
|
#include <wups/config/WUPSConfigItemStub.h>
|
||||||
|
|
||||||
WUPS_PLUGIN_NAME("FTPiiU");
|
WUPS_PLUGIN_NAME("FTPiiU");
|
||||||
WUPS_PLUGIN_DESCRIPTION("FTP Server");
|
WUPS_PLUGIN_DESCRIPTION("FTP Server");
|
||||||
WUPS_PLUGIN_VERSION(VERSION_FULL_RAW);
|
WUPS_PLUGIN_VERSION(VERSION_FULL);
|
||||||
WUPS_PLUGIN_AUTHOR("Maschell");
|
WUPS_PLUGIN_AUTHOR("Maschell");
|
||||||
WUPS_PLUGIN_LICENSE("GPL");
|
WUPS_PLUGIN_LICENSE("GPL");
|
||||||
|
|
||||||
WUPS_USE_WUT_DEVOPTAB();
|
WUPS_USE_WUT_DEVOPTAB();
|
||||||
|
WUPS_USE_STORAGE("ftpiiu"); // Unqiue id for the storage api
|
||||||
|
|
||||||
uint32_t hostIpAddress = 0;
|
uint32_t hostIpAddress = 0;
|
||||||
|
|
||||||
BackgroundThread *thread = nullptr;
|
BackgroundThread *thread = nullptr;
|
||||||
|
|
||||||
|
#define FTPIIU_ENABLED_STRING "enabled"
|
||||||
|
#define SYSTEM_FILES_ALLOWED_STRING "systemFilesAllowed"
|
||||||
|
|
||||||
|
bool gFTPServerEnabled = true;
|
||||||
|
bool gSystemFilesAllowed = false;
|
||||||
|
|
||||||
MochaUtilsStatus MountWrapper(const char *mount, const char *dev, const char *mountTo) {
|
MochaUtilsStatus MountWrapper(const char *mount, const char *dev, const char *mountTo) {
|
||||||
auto res = Mocha_MountFS(mount, dev, mountTo);
|
auto res = Mocha_MountFS(mount, dev, mountTo);
|
||||||
if (res == MOCHA_RESULT_ALREADY_EXISTS) {
|
if (res == MOCHA_RESULT_ALREADY_EXISTS) {
|
||||||
@ -34,22 +44,60 @@ MochaUtilsStatus MountWrapper(const char *mount, const char *dev, const char *mo
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
void startServer();
|
||||||
|
void stopServer();
|
||||||
|
|
||||||
/* Entry point */
|
/* Entry point */
|
||||||
ON_APPLICATION_START() {
|
ON_APPLICATION_START() {
|
||||||
nn::ac::Initialize();
|
nn::ac::Initialize();
|
||||||
nn::ac::ConnectAsync();
|
nn::ac::ConnectAsync();
|
||||||
|
hostIpAddress = 0;
|
||||||
nn::ac::GetAssignedAddress(&hostIpAddress);
|
nn::ac::GetAssignedAddress(&hostIpAddress);
|
||||||
initLogging();
|
initLogging();
|
||||||
|
|
||||||
|
|
||||||
|
if (gFTPServerEnabled) {
|
||||||
|
startServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
INITIALIZE_PLUGIN() {
|
||||||
|
// Open storage to read values
|
||||||
|
WUPSStorageError storageRes = WUPS_OpenStorage();
|
||||||
|
if (storageRes != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to open storage %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes);
|
||||||
|
} else {
|
||||||
|
if ((storageRes = WUPS_GetBool(nullptr, FTPIIU_ENABLED_STRING, &gFTPServerEnabled)) == WUPS_STORAGE_ERROR_NOT_FOUND) {
|
||||||
|
// Add the value to the storage if it's missing.
|
||||||
|
if (WUPS_StoreBool(nullptr, FTPIIU_ENABLED_STRING, gFTPServerEnabled) != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to store bool");
|
||||||
|
}
|
||||||
|
} else if (storageRes != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to get bool %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes);
|
||||||
|
}
|
||||||
|
if ((storageRes = WUPS_GetBool(nullptr, SYSTEM_FILES_ALLOWED_STRING, &gSystemFilesAllowed)) == WUPS_STORAGE_ERROR_NOT_FOUND) {
|
||||||
|
// Add the value to the storage if it's missing.
|
||||||
|
if (WUPS_StoreBool(nullptr, SYSTEM_FILES_ALLOWED_STRING, gSystemFilesAllowed) != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to store bool");
|
||||||
|
}
|
||||||
|
} else if (storageRes != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to get bool %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close storage
|
||||||
|
if (WUPS_CloseStorage() != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to close storage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thread = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void startServer() {
|
||||||
|
if (!thread) {
|
||||||
//!*******************************************************************
|
//!*******************************************************************
|
||||||
//! Initialize FS *
|
//! Initialize FS *
|
||||||
//!*******************************************************************
|
//!*******************************************************************
|
||||||
|
if (gSystemFilesAllowed) {
|
||||||
VirtualMountDevice("fs:/");
|
|
||||||
AddVirtualFSPath("vol", nullptr, nullptr);
|
|
||||||
AddVirtualFSVOLPath("external01", nullptr, nullptr);
|
|
||||||
AddVirtualFSVOLPath("content", nullptr, nullptr);
|
|
||||||
MochaUtilsStatus res;
|
MochaUtilsStatus res;
|
||||||
if ((res = Mocha_InitLibrary()) == MOCHA_RESULT_SUCCESS) {
|
if ((res = Mocha_InitLibrary()) == MOCHA_RESULT_SUCCESS) {
|
||||||
MountWrapper("slccmpt01", "/dev/slccmpt01", "/vol/storage_slccmpt01");
|
MountWrapper("slccmpt01", "/dev/slccmpt01", "/vol/storage_slccmpt01");
|
||||||
@ -63,21 +111,19 @@ ON_APPLICATION_START() {
|
|||||||
} else {
|
} else {
|
||||||
DEBUG_FUNCTION_LINE_ERR("Failed to init libmocha: %s [%d]", Mocha_GetStatusStr(res), res);
|
DEBUG_FUNCTION_LINE_ERR("Failed to init libmocha: %s [%d]", Mocha_GetStatusStr(res), res);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MountVirtualDevices();
|
||||||
|
|
||||||
thread = BackgroundThread::getInstance();
|
thread = BackgroundThread::getInstance();
|
||||||
DCFlushRange(&thread, 4);
|
OSMemoryBarrier();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void stopThread() {
|
|
||||||
|
void stopServer() {
|
||||||
BackgroundThread::destroyInstance();
|
BackgroundThread::destroyInstance();
|
||||||
}
|
if (gSystemFilesAllowed) {
|
||||||
|
|
||||||
ON_APPLICATION_REQUESTS_EXIT() {
|
|
||||||
DEBUG_FUNCTION_LINE_VERBOSE("Ending ftp server");
|
|
||||||
stopThread();
|
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE_VERBOSE("Ended ftp Server.");
|
|
||||||
|
|
||||||
Mocha_UnmountFS("slccmpt01");
|
Mocha_UnmountFS("slccmpt01");
|
||||||
Mocha_UnmountFS("storage_odd_tickets");
|
Mocha_UnmountFS("storage_odd_tickets");
|
||||||
Mocha_UnmountFS("storage_odd_updates");
|
Mocha_UnmountFS("storage_odd_updates");
|
||||||
@ -86,11 +132,99 @@ ON_APPLICATION_REQUESTS_EXIT() {
|
|||||||
Mocha_UnmountFS("storage_slc");
|
Mocha_UnmountFS("storage_slc");
|
||||||
Mocha_UnmountFS("storage_mlc");
|
Mocha_UnmountFS("storage_mlc");
|
||||||
Mocha_UnmountFS("storage_usb");
|
Mocha_UnmountFS("storage_usb");
|
||||||
|
}
|
||||||
Mocha_DeInitLibrary();
|
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Unmount virtual paths");
|
DEBUG_FUNCTION_LINE("Unmount virtual paths");
|
||||||
UnmountVirtualPaths();
|
UnmountVirtualPaths();
|
||||||
|
|
||||||
|
thread = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gFTPServerRunningChanged(ConfigItemBoolean *item, bool newValue) {
|
||||||
|
DEBUG_FUNCTION_LINE("New value in gFTPServerEnabled: %d", newValue);
|
||||||
|
gFTPServerEnabled = newValue;
|
||||||
|
if (!gFTPServerEnabled) {
|
||||||
|
stopServer();
|
||||||
|
} else {
|
||||||
|
startServer();
|
||||||
|
}
|
||||||
|
// If the value has changed, we store it in the storage.
|
||||||
|
auto res = WUPS_StoreInt(nullptr, FTPIIU_ENABLED_STRING, gFTPServerEnabled);
|
||||||
|
if (res != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to store gFTPServerEnabled: %s (%d)", WUPS_GetStorageStatusStr(res), res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void gSystemFilesAllowedChanged(ConfigItemBoolean *item, bool newValue) {
|
||||||
|
DEBUG_FUNCTION_LINE("New value in gFTPServerEnabled: %d", newValue);
|
||||||
|
if (thread != nullptr) { // If the server is already running we need to restart it.
|
||||||
|
stopServer();
|
||||||
|
gSystemFilesAllowed = newValue;
|
||||||
|
startServer();
|
||||||
|
} else {
|
||||||
|
gSystemFilesAllowed = newValue;
|
||||||
|
}
|
||||||
|
// If the value has changed, we store it in the storage.
|
||||||
|
auto res = WUPS_StoreInt(nullptr, SYSTEM_FILES_ALLOWED_STRING, gSystemFilesAllowed);
|
||||||
|
if (res != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to store gSystemFilesAllowed: %s (%d)", WUPS_GetStorageStatusStr(res), res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WUPS_GET_CONFIG() {
|
||||||
|
// We open the storage, so we can persist the configuration the user did.
|
||||||
|
if (WUPS_OpenStorage() != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to open storage");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
nn::ac::GetAssignedAddress(&hostIpAddress);
|
||||||
|
|
||||||
|
WUPSConfigHandle config;
|
||||||
|
WUPSConfig_CreateHandled(&config, "FTPiiU");
|
||||||
|
|
||||||
|
WUPSConfigCategoryHandle setting;
|
||||||
|
WUPSConfig_AddCategoryByNameHandled(config, "Settings", &setting);
|
||||||
|
|
||||||
|
WUPSConfigItemBoolean_AddToCategoryHandled(config, setting, FTPIIU_ENABLED_STRING, "Enable FTPiiU", gFTPServerEnabled, &gFTPServerRunningChanged);
|
||||||
|
WUPSConfigItemBoolean_AddToCategoryHandled(config, setting, SYSTEM_FILES_ALLOWED_STRING, "Allow access to system files", gSystemFilesAllowed, &gSystemFilesAllowedChanged);
|
||||||
|
|
||||||
|
WUPSConfigCategoryHandle info;
|
||||||
|
WUPSConfig_AddCategoryByNameHandled(config, "==========", &info);
|
||||||
|
WUPSConfigItemStub_AddToCategoryHandled(config, info, "info", "Press B to go Back");
|
||||||
|
|
||||||
|
WUPSConfigCategoryHandle info1;
|
||||||
|
char ipSettings[50];
|
||||||
|
if (hostIpAddress != 0) {
|
||||||
|
snprintf(ipSettings, 50, "IP of your console is %u.%u.%u.%u. Port %i",
|
||||||
|
(hostIpAddress >> 24) & 0xFF,
|
||||||
|
(hostIpAddress >> 16) & 0xFF,
|
||||||
|
(hostIpAddress >> 8) & 0xFF,
|
||||||
|
(hostIpAddress >> 0) & 0xFF,
|
||||||
|
PORT);
|
||||||
|
} else {
|
||||||
|
snprintf(ipSettings, 50, "The console is not connected to a network.");
|
||||||
|
}
|
||||||
|
WUPSConfig_AddCategoryByNameHandled(config, ipSettings, &info1);
|
||||||
|
WUPSConfigItemStub_AddToCategoryHandled(config, info1, "info1", "Press B to go Back");
|
||||||
|
|
||||||
|
WUPSConfigCategoryHandle info2;
|
||||||
|
char portSettings[50];
|
||||||
|
snprintf(portSettings, 50, "You can connect with empty credentials");
|
||||||
|
WUPSConfig_AddCategoryByNameHandled(config, portSettings, &info2);
|
||||||
|
WUPSConfigItemStub_AddToCategoryHandled(config, info2, "info2", "Press B to go Back");
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
WUPS_CONFIG_CLOSED() {
|
||||||
|
// Save all changes
|
||||||
|
if (WUPS_CloseStorage() != WUPS_STORAGE_ERROR_SUCCESS) {
|
||||||
|
DEBUG_FUNCTION_LINE_ERR("Failed to close storage");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ON_APPLICATION_REQUESTS_EXIT() {
|
||||||
|
stopServer();
|
||||||
|
|
||||||
deinitLogging();
|
deinitLogging();
|
||||||
}
|
}
|
||||||
|
@ -12,11 +12,13 @@ extern "C" {
|
|||||||
|
|
||||||
#define MAXPATHLEN 256
|
#define MAXPATHLEN 256
|
||||||
|
|
||||||
#define VERSION_RAW "0.1.1"
|
#define VERSION "v0.1.1"
|
||||||
#define VERSION_FULL_RAW VERSION_RAW VERSION_EXTRA
|
#define VERSION_FULL VERSION VERSION_EXTRA
|
||||||
|
|
||||||
#define wiiu_geterrno() (errno)
|
#define wiiu_geterrno() (errno)
|
||||||
|
|
||||||
|
extern bool gSystemFilesAllowed;
|
||||||
|
|
||||||
//! C wrapper for our C++ functions
|
//! C wrapper for our C++ functions
|
||||||
int Menu_Main(void);
|
int Menu_Main(void);
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
* for WiiXplorer 2010
|
* for WiiXplorer 2010
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#include "virtualpath.h"
|
#include "virtualpath.h"
|
||||||
|
#include "main.h"
|
||||||
#include "utils/logger.h"
|
#include "utils/logger.h"
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -138,6 +139,7 @@ void AddVirtualFSVOLPath(const char *name, const char *alias, const char *prefix
|
|||||||
|
|
||||||
void MountVirtualDevices() {
|
void MountVirtualDevices() {
|
||||||
VirtualMountDevice("fs:/");
|
VirtualMountDevice("fs:/");
|
||||||
|
if (gSystemFilesAllowed) {
|
||||||
VirtualMountDevice("slccmpt01:/");
|
VirtualMountDevice("slccmpt01:/");
|
||||||
VirtualMountDevice("storage_odd_tickets:/");
|
VirtualMountDevice("storage_odd_tickets:/");
|
||||||
VirtualMountDevice("storage_odd_updates:/");
|
VirtualMountDevice("storage_odd_updates:/");
|
||||||
@ -147,7 +149,7 @@ void MountVirtualDevices() {
|
|||||||
VirtualMountDevice("storage_mlc:/");
|
VirtualMountDevice("storage_mlc:/");
|
||||||
VirtualMountDevice("storage_usb:/");
|
VirtualMountDevice("storage_usb:/");
|
||||||
VirtualMountDevice("usb:/");
|
VirtualMountDevice("usb:/");
|
||||||
|
}
|
||||||
AddVirtualFSPath("vol", NULL, NULL);
|
AddVirtualFSPath("vol", NULL, NULL);
|
||||||
AddVirtualFSVOLPath("external01", NULL, NULL);
|
AddVirtualFSVOLPath("external01", NULL, NULL);
|
||||||
AddVirtualFSVOLPath("content", NULL, NULL);
|
AddVirtualFSVOLPath("content", NULL, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user