[Add] Editor build menu and patch Lua sandbox vuln.
This commit is contained in:
		
							parent
							
								
									233dd384f6
								
							
						
					
					
						commit
						b4855fa47e
					
				@ -358,6 +358,12 @@ void GameState::send_file_read_request(uint32_t session_id, const std::string& p
 | 
			
		||||
                                             {std::to_string(session_id), path}));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GameState::send_build_file_request(uint32_t session_id, const std::string& path,
 | 
			
		||||
                                        const std::string& content) {
 | 
			
		||||
  _network->send(net_protocol::build_message(net_protocol::Opcode::C2S_BUILD_FILE,
 | 
			
		||||
                                             {std::to_string(session_id), path, content}));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GameState::send_create_session_request(void) {
 | 
			
		||||
  if(_network && _network->is_connected()) {
 | 
			
		||||
    _network->send(net_protocol::build_message(net_protocol::Opcode::C2S_CREATE_SESSION));
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ public:
 | 
			
		||||
  /* Public network interface for UI components. */
 | 
			
		||||
  void send_network_command(uint32_t session_id, const std::string& command);
 | 
			
		||||
  void send_file_write_request(uint32_t session_id, const std::string& path, const std::string& content);
 | 
			
		||||
  void send_build_file_request(uint32_t session_id, const std::string& path, const std::string& content);
 | 
			
		||||
  void send_file_read_request(uint32_t session_id, const std::string& path);
 | 
			
		||||
  void send_create_session_request(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -200,6 +200,12 @@ void Desktop::update(float dt, int screen_width, int screen_height) {
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        case ActionType::BUILD_FILE: {
 | 
			
		||||
          if(session_id != 0) {
 | 
			
		||||
            _game_state->send_build_file_request(session_id, action.payload1, action.payload2);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        default:
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,10 @@ Editor::Editor(void)
 | 
			
		||||
  _menu_bar->add_menu_item("File", "Save", [this]() {
 | 
			
		||||
    _pending_action = {ActionType::WRITE_FILE, _filename, _buffer.get_text()};
 | 
			
		||||
  });
 | 
			
		||||
  _menu_bar->add_menu("Build");
 | 
			
		||||
  _menu_bar->add_menu_item("Build", "Run Build", [this]() {
 | 
			
		||||
    _pending_action = {ActionType::BUILD_FILE, _filename, _buffer.get_text()};
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Editor::Editor(const std::string& filename)
 | 
			
		||||
@ -25,6 +29,10 @@ Editor::Editor(const std::string& filename)
 | 
			
		||||
  _menu_bar->add_menu_item("File", "Save", [this]() {
 | 
			
		||||
    _pending_action = {ActionType::WRITE_FILE, _filename, _buffer.get_text()};
 | 
			
		||||
  });
 | 
			
		||||
  _menu_bar->add_menu("Build");
 | 
			
		||||
  _menu_bar->add_menu_item("Build", "Run Build", [this]() {
 | 
			
		||||
    _pending_action = {ActionType::BUILD_FILE, _filename, _buffer.get_text()};
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Editor::~Editor(void) {}
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ enum class ActionType {
 | 
			
		||||
  NONE,
 | 
			
		||||
  WRITE_FILE,
 | 
			
		||||
  READ_FILE,
 | 
			
		||||
  BUILD_FILE,
 | 
			
		||||
  CLOSE_WINDOW
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,7 +9,7 @@
 | 
			
		||||
#include "vfs.h"
 | 
			
		||||
 | 
			
		||||
LuaProcessor::LuaProcessor(Session& context) {
 | 
			
		||||
  _lua.open_libraries(sol::lib::base, sol::lib::string, sol::lib::io, sol::lib::table);
 | 
			
		||||
  _lua.open_libraries(sol::lib::base, sol::lib::string, sol::lib::table);
 | 
			
		||||
 | 
			
		||||
  /* Expose vfs_node struct members to Lua. */
 | 
			
		||||
  _lua.new_usertype<vfs_node>("vfs_node",
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ enum class Opcode : uint8_t {
 | 
			
		||||
  C2S_COMMAND,    /* args: [session_id, command] */
 | 
			
		||||
  C2S_WRITE_FILE, /* args: [session_id, path, content] */
 | 
			
		||||
  C2S_READ_FILE,  /* args: [session_id, path] */
 | 
			
		||||
  C2S_BUILD_FILE, /* args: [session_id, path, content] */
 | 
			
		||||
 | 
			
		||||
  /* Server -> Client messages. */
 | 
			
		||||
  S2C_CREATE_ACCOUNT_SUCCESS,
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
#include "network_manager.h"
 | 
			
		||||
#include "lua_api.h"
 | 
			
		||||
#include "net/message_protocol.h"
 | 
			
		||||
#include "db/database_manager.h"
 | 
			
		||||
 | 
			
		||||
@ -210,6 +211,28 @@ void NetworkManager::on_message(std::shared_ptr<net::TcpConnection> connection,
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
      case net_protocol::Opcode::C2S_BUILD_FILE:
 | 
			
		||||
        if(args.size() == 3) {
 | 
			
		||||
          uint32_t session_id = std::stoul(args[0]);
 | 
			
		||||
          if(player->sessions.count(session_id)) {
 | 
			
		||||
            Session* session = player->sessions.at(session_id).get();
 | 
			
		||||
            const std::string& path = args[1];
 | 
			
		||||
            const std::string& content = args[2];
 | 
			
		||||
 | 
			
		||||
            /* Save the file to ensure the VFS is up to date. */
 | 
			
		||||
            session->write_file(path, content);
 | 
			
		||||
 | 
			
		||||
            /* The 'build.lua' script is just a wrapper around 'api::create_executable'. */
 | 
			
		||||
            std::string exec_path = path;
 | 
			
		||||
            size_t dot_pos = exec_path.rfind(".lua");
 | 
			
		||||
            if(dot_pos != std::string::npos) {
 | 
			
		||||
              exec_path.erase(dot_pos);
 | 
			
		||||
            }
 | 
			
		||||
            /* The api function returns an error string, but we'll ignore it here for now. */
 | 
			
		||||
            api::create_executable(*session, exec_path, content);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
      fprintf(stderr, "Received invalid opcode %d from active player.\n",
 | 
			
		||||
              static_cast<int>(opcode));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user