You've already forked Arcturus-Morningstar-Extended
mirror of
https://github.com/duckietm/Arcturus-Morningstar-Extended.git
synced 2026-06-20 23:36:19 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 67503aeb2a | |||
| b206b32748 | |||
| ad60861a3f | |||
| b77290f5e7 | |||
| b14730d37f | |||
| 9126396973 | |||
| d321ff3b85 | |||
| 7f38a25eef |
@@ -23,6 +23,10 @@ SET NAMES utf8mb4;
|
||||
ALTER TABLE `emulator_settings`
|
||||
ADD COLUMN IF NOT EXISTS `comment` TEXT NULL DEFAULT '' AFTER `value`;
|
||||
|
||||
ALTER TABLE catalog_pages
|
||||
ADD COLUMN IF NOT EXISTS `catalog_mode` ENUM('NORMAL', 'BUILDER', 'BOTH') NOT NULL DEFAULT 'NORMAL' AFTER `includes`;
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `wired_emulator_settings` (
|
||||
`key` VARCHAR(255) NOT NULL,
|
||||
`value` TEXT NOT NULL,
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.eu.habbo</groupId>
|
||||
<artifactId>Habbo</artifactId>
|
||||
<version>4.2.14</version>
|
||||
<version>4.2.16</version>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
+13
@@ -36,6 +36,19 @@ public class CatalogAdminCreatePageEvent extends MessageHandler {
|
||||
pageLayout = CatalogPageLayouts.default_3x3;
|
||||
}
|
||||
|
||||
if (parentId != -1 && Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(parentId) == null) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Parent page not found: " + parentId));
|
||||
return;
|
||||
}
|
||||
|
||||
if (iconType < 0) iconType = 0;
|
||||
if (minRank < 1) minRank = 1;
|
||||
if (orderNum < 0) orderNum = 0;
|
||||
if (caption == null) caption = "";
|
||||
if (caption2 == null) caption2 = "";
|
||||
if (caption.length() > 128) caption = caption.substring(0, 128);
|
||||
if (caption2.length() > 25) caption2 = caption2.substring(0, 25);
|
||||
|
||||
CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().createCatalogPage(
|
||||
caption, caption2, 0, iconType, pageLayout, minRank, parentId, pageType, catalogMode
|
||||
);
|
||||
|
||||
+40
-4
@@ -1,6 +1,7 @@
|
||||
package com.eu.habbo.messages.incoming.catalog.catalogadmin;
|
||||
|
||||
import com.eu.habbo.Emulator;
|
||||
import com.eu.habbo.habbohotel.catalog.CatalogPage;
|
||||
import com.eu.habbo.habbohotel.catalog.CatalogPageType;
|
||||
import com.eu.habbo.habbohotel.permissions.Permission;
|
||||
import com.eu.habbo.messages.incoming.MessageHandler;
|
||||
@@ -11,6 +12,9 @@ import java.sql.PreparedStatement;
|
||||
|
||||
public class CatalogAdminMovePageEvent extends MessageHandler {
|
||||
|
||||
private static final int MAX_PARENT_WALK = 64;
|
||||
private static final int ROOT_PARENT_ID = -1;
|
||||
|
||||
@Override
|
||||
public void handle() throws Exception {
|
||||
if (!this.client.getHabbo().hasPermission(Permission.ACC_CATALOGFURNI)) {
|
||||
@@ -24,9 +28,7 @@ public class CatalogAdminMovePageEvent extends MessageHandler {
|
||||
CatalogPageType pageType = CatalogPageType.fromString(this.packet.readString());
|
||||
String tableName = (pageType == CatalogPageType.BUILDER) ? "catalog_pages_bc" : "catalog_pages";
|
||||
|
||||
// Special values: -1 = toggle enabled, -2 = toggle visible
|
||||
if (newParentId == -1) {
|
||||
// Toggle enabled
|
||||
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(
|
||||
"UPDATE " + tableName + " SET enabled = IF(enabled = '1', '0', '1') WHERE id = ?")) {
|
||||
@@ -38,7 +40,6 @@ public class CatalogAdminMovePageEvent extends MessageHandler {
|
||||
}
|
||||
|
||||
if (newParentId == -2) {
|
||||
// Toggle visible
|
||||
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(
|
||||
"UPDATE " + tableName + " SET visible = IF(visible = '1', '0', '1') WHERE id = ?")) {
|
||||
@@ -49,7 +50,30 @@ public class CatalogAdminMovePageEvent extends MessageHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
// Normal move: update parent and order
|
||||
CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(pageId, pageType);
|
||||
if (page == null) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Page not found: " + pageId));
|
||||
return;
|
||||
}
|
||||
|
||||
if (newParentId == pageId) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "A page cannot be its own parent"));
|
||||
return;
|
||||
}
|
||||
|
||||
CatalogPage parent = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(newParentId);
|
||||
if (parent == null) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Parent page not found: " + newParentId));
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.wouldCreateCycle(pageId, newParentId)) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Refusing to move: that would create a cycle"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (newIndex < 0) newIndex = 0;
|
||||
|
||||
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(
|
||||
"UPDATE " + tableName + " SET parent_id = ?, order_num = ? WHERE id = ?")) {
|
||||
@@ -61,4 +85,16 @@ public class CatalogAdminMovePageEvent extends MessageHandler {
|
||||
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(true, "Page moved"));
|
||||
}
|
||||
|
||||
private boolean wouldCreateCycle(int pageId, int parentId) {
|
||||
int current = parentId;
|
||||
for (int hops = 0; hops < MAX_PARENT_WALK; hops++) {
|
||||
if (current == ROOT_PARENT_ID) return false;
|
||||
if (current == pageId) return true;
|
||||
CatalogPage parent = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(current);
|
||||
if (parent == null) return false;
|
||||
current = parent.getParentId();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
+97
-6
@@ -2,16 +2,35 @@ package com.eu.habbo.messages.incoming.catalog.catalogadmin;
|
||||
|
||||
import com.eu.habbo.Emulator;
|
||||
import com.eu.habbo.habbohotel.catalog.CatalogPage;
|
||||
import com.eu.habbo.habbohotel.catalog.CatalogPageLayouts;
|
||||
import com.eu.habbo.habbohotel.catalog.CatalogPageType;
|
||||
import com.eu.habbo.habbohotel.permissions.Permission;
|
||||
import com.eu.habbo.messages.incoming.MessageHandler;
|
||||
import com.eu.habbo.messages.outgoing.catalog.catalogadmin.CatalogAdminResultComposer;
|
||||
import org.jsoup.Jsoup;
|
||||
import org.jsoup.safety.Safelist;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
|
||||
public class CatalogAdminSavePageEvent extends MessageHandler {
|
||||
|
||||
private static final int MAX_CAPTION_LENGTH = 128;
|
||||
private static final int MAX_CAPTION_SAVE_LENGTH = 25;
|
||||
private static final int MAX_HEADLINE_LENGTH = 1024;
|
||||
private static final int MAX_TEASER_LENGTH = 64;
|
||||
private static final int MAX_TEXT_LENGTH = 8192;
|
||||
private static final int MAX_PARENT_WALK = 64;
|
||||
private static final int ROOT_PARENT_ID = -1;
|
||||
|
||||
private static final Safelist PAGE_HTML_SAFELIST = new Safelist()
|
||||
.addTags("b", "i", "u", "br", "span", "div", "p", "a", "strong", "em", "img")
|
||||
.addAttributes("a", "href", "target", "class", "style")
|
||||
.addAttributes("img", "src", "alt", "class", "style")
|
||||
.addAttributes(":all", "class", "style")
|
||||
.addProtocols("a", "href", "http", "https", "mailto", "#")
|
||||
.addProtocols("img", "src", "http", "https", "data");
|
||||
|
||||
@Override
|
||||
public void handle() throws Exception {
|
||||
if (!this.client.getHabbo().hasPermission(Permission.ACC_CATALOGFURNI)) {
|
||||
@@ -34,7 +53,7 @@ public class CatalogAdminSavePageEvent extends MessageHandler {
|
||||
String textDetails = this.packet.readString();
|
||||
CatalogPageType pageType = CatalogPageType.fromString(this.packet.readString());
|
||||
CatalogPageType catalogMode = CatalogPageType.fromString(this.packet.readString());
|
||||
|
||||
String text1 = this.packet.bytesAvailable() > 0 ? this.packet.readString() : "";
|
||||
CatalogPage page = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(pageId, pageType);
|
||||
|
||||
if (page == null) {
|
||||
@@ -42,9 +61,55 @@ public class CatalogAdminSavePageEvent extends MessageHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
CatalogPageLayouts.valueOf(layout);
|
||||
} catch (IllegalArgumentException | NullPointerException e) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Invalid layout: " + layout));
|
||||
return;
|
||||
}
|
||||
|
||||
if (parentId != ROOT_PARENT_ID) {
|
||||
if (parentId == pageId) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "A page cannot be its own parent"));
|
||||
return;
|
||||
}
|
||||
|
||||
CatalogPage parent = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(parentId);
|
||||
if (parent == null) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Parent page not found: " + parentId));
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.wouldCreateCycle(pageId, parentId)) {
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(false, "Refusing to re-parent: that would create a cycle"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (iconType < 0) iconType = 0;
|
||||
if (minRank < 1) minRank = 1;
|
||||
if (orderNum < 0) orderNum = 0;
|
||||
|
||||
headline = this.sanitizeHtml(headline);
|
||||
teaser = this.sanitizeHtml(teaser);
|
||||
textDetails = this.sanitizeHtml(textDetails);
|
||||
text1 = this.sanitizeHtml(text1);
|
||||
|
||||
caption = this.clampLength(caption, MAX_CAPTION_LENGTH);
|
||||
caption2 = this.clampLength(caption2, MAX_CAPTION_SAVE_LENGTH);
|
||||
headline = this.clampLength(headline, MAX_HEADLINE_LENGTH);
|
||||
teaser = this.clampLength(teaser, MAX_TEASER_LENGTH);
|
||||
textDetails = this.clampLength(textDetails, MAX_TEXT_LENGTH);
|
||||
text1 = this.clampLength(text1, MAX_TEXT_LENGTH);
|
||||
|
||||
if (headline.isEmpty() && page.getHeaderImage() != null) headline = page.getHeaderImage();
|
||||
if (teaser.isEmpty() && page.getTeaserImage() != null) teaser = page.getTeaserImage();
|
||||
if (textDetails.isEmpty() && page.getTextDetails() != null) textDetails = page.getTextDetails();
|
||||
if (text1.isEmpty() && page.getTextOne() != null) text1 = page.getTextOne();
|
||||
|
||||
String query = (pageType == CatalogPageType.BUILDER)
|
||||
? "UPDATE catalog_pages_bc SET caption = ?, page_layout = ?, icon_image = ?, visible = ?, enabled = ?, order_num = ?, parent_id = ?, page_headline = ?, page_teaser = ?, page_text_details = ? WHERE id = ?"
|
||||
: "UPDATE catalog_pages SET caption = ?, caption_save = ?, page_layout = ?, icon_image = ?, min_rank = ?, visible = ?, enabled = ?, order_num = ?, parent_id = ?, page_headline = ?, page_teaser = ?, page_text_details = ?, catalog_mode = ? WHERE id = ?";
|
||||
? "UPDATE catalog_pages_bc SET caption = ?, page_layout = ?, icon_image = ?, visible = ?, enabled = ?, order_num = ?, parent_id = ?, page_headline = ?, page_teaser = ?, page_text_details = ?, page_text1 = ? WHERE id = ?"
|
||||
: "UPDATE catalog_pages SET caption = ?, caption_save = ?, page_layout = ?, icon_image = ?, min_rank = ?, visible = ?, enabled = ?, order_num = ?, parent_id = ?, page_headline = ?, page_teaser = ?, page_text_details = ?, page_text1 = ?, catalog_mode = ? WHERE id = ?";
|
||||
|
||||
try (Connection connection = Emulator.getDatabase().getDataSource().getConnection();
|
||||
PreparedStatement statement = connection.prepareStatement(query)) {
|
||||
@@ -60,7 +125,8 @@ public class CatalogAdminSavePageEvent extends MessageHandler {
|
||||
statement.setString(8, headline);
|
||||
statement.setString(9, teaser);
|
||||
statement.setString(10, textDetails);
|
||||
statement.setInt(11, pageId);
|
||||
statement.setString(11, text1);
|
||||
statement.setInt(12, pageId);
|
||||
} else {
|
||||
statement.setString(2, caption2);
|
||||
statement.setString(3, layout);
|
||||
@@ -73,8 +139,9 @@ public class CatalogAdminSavePageEvent extends MessageHandler {
|
||||
statement.setString(10, headline);
|
||||
statement.setString(11, teaser);
|
||||
statement.setString(12, textDetails);
|
||||
statement.setString(13, catalogMode.name());
|
||||
statement.setInt(14, pageId);
|
||||
statement.setString(13, text1);
|
||||
statement.setString(14, catalogMode.name());
|
||||
statement.setInt(15, pageId);
|
||||
}
|
||||
|
||||
statement.execute();
|
||||
@@ -82,4 +149,28 @@ public class CatalogAdminSavePageEvent extends MessageHandler {
|
||||
|
||||
this.client.sendResponse(new CatalogAdminResultComposer(true, "Page saved"));
|
||||
}
|
||||
|
||||
private boolean wouldCreateCycle(int pageId, int parentId) {
|
||||
int current = parentId;
|
||||
for (int hops = 0; hops < MAX_PARENT_WALK; hops++) {
|
||||
if (current == ROOT_PARENT_ID) return false;
|
||||
if (current == pageId) return true;
|
||||
CatalogPage parent = Emulator.getGameEnvironment().getCatalogManager().getCatalogPage(current);
|
||||
if (parent == null) return false;
|
||||
current = parent.getParentId();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private String clampLength(String value, int max) {
|
||||
if (value == null) return "";
|
||||
if (value.length() <= max) return value;
|
||||
return value.substring(0, max);
|
||||
}
|
||||
|
||||
|
||||
private String sanitizeHtml(String value) {
|
||||
if (value == null || value.isEmpty()) return "";
|
||||
return Jsoup.clean(value, PAGE_HTML_SAFELIST);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -41,6 +41,7 @@ public class CatalogPagesListComposer extends MessageComposer {
|
||||
this.response.appendBoolean(true);
|
||||
this.response.appendInt(0);
|
||||
this.response.appendInt(-1);
|
||||
this.response.appendInt(-1);
|
||||
this.response.appendString("root");
|
||||
this.response.appendString("");
|
||||
this.response.appendInt(0);
|
||||
@@ -68,7 +69,8 @@ public class CatalogPagesListComposer extends MessageComposer {
|
||||
|
||||
this.response.appendBoolean(category.isVisible());
|
||||
this.response.appendInt(category.getIconImage());
|
||||
this.response.appendInt(category.isEnabled() ? category.getId() : -1);
|
||||
this.response.appendInt(category.isEnabled() || this.hasPermission ? category.getId() : -1);
|
||||
this.response.appendInt(category.getParentId());
|
||||
this.response.appendString(category.getPageName());
|
||||
this.response.appendString(category.getCaption() + (this.hasPermission ? " (" + category.getId() + ")" : ""));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user