diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index b6bd796554..43499f56f5 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -603,6 +603,123 @@ jobs: ./mvnw -B clean package exec:java -Dexec.args="$GITHUB_WORKSPACE" + cockroachdb-install: + name: Test CockroachDB install script + needs: [build, should-do-database-tests, check_branch] + runs-on: ubuntu-latest + if: ${{ needs.should-do-database-tests.outputs.check == 'true' || needs.check_branch.outputs.is_publishable_branch == 'true'}} + steps: + - name: Checkout Openfire + uses: actions/checkout@v6 + - name: Set up JDK 17 Zulu + uses: actions/setup-java@v5 + with: + java-version: 17 + distribution: zulu + cache: maven + - name: Restore mvn repo artifacts from build job + uses: actions/download-artifact@v8 + with: + name: Maven Repository + path: ~/.m2/repository/org/igniterealtime/openfire/ + - name: Set environment variables + run: | + echo "CONNECTION_STRING=jdbc:postgresql://localhost:26257/openfire?sslmode=disable" >> $GITHUB_ENV + echo "CONNECTION_DRIVER=org.postgresql.Driver" >> $GITHUB_ENV + echo "CONNECTION_USERNAME=root" >> $GITHUB_ENV + echo "CONNECTION_PASSWORD=" >> $GITHUB_ENV + OPENFIREVSN=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout) + echo "OPENFIREVSN=$OPENFIREVSN" >> $GITHUB_ENV + echo "JAVA_HOME=$(echo $JAVA_HOME_17_X64)" >> $GITHUB_ENV + - name: Start database server and create empty database + run: | + docker compose -f ./build/ci/compose/cockroachdb.yml up --wait + docker compose -f ./build/ci/compose/cockroachdb.yml exec db /cockroach/cockroach sql --insecure --execute="CREATE DATABASE openfire;" + - name: Execute Openfire's database install script + run: | + pushd ./build/ci/updater + ./mvnw -B clean package exec:java -Dexec.args="$GITHUB_WORKSPACE" + + + # CockroachDB support was added recently and upgrade scripts are not available yet by virtue of support being new. + # Skip CockroachDB upgrade execution until the target upgrade directory exists. This step can be removed completely + # after things have matured. + cockroachdb-upgrade-precheck: + name: Check CockroachDB upgrade prerequisites + needs: [should-do-database-tests, check_branch] + runs-on: ubuntu-latest + if: ${{ needs.should-do-database-tests.outputs.check == 'true' || needs.check_branch.outputs.is_publishable_branch == 'true'}} + outputs: + upgrade-dir-exists: ${{ steps.check-cockroachdb-upgrade-dir.outputs.exists }} + steps: + - name: Checkout Openfire + uses: actions/checkout@v6 + - name: Check if CockroachDB upgrade directory exists + id: check-cockroachdb-upgrade-dir + # CockroachDB support was added recently and upgrade scripts are not available yet by virtue of support being new. + # Skip CockroachDB upgrade execution until the target upgrade directory exists. + run: | + if [ -d distribution/src/database/upgrade/39 ]; then + echo "exists=true" >> "$GITHUB_OUTPUT" + else + echo "exists=false" >> "$GITHUB_OUTPUT" + echo "Skipping cockroachdb-upgrade: CockroachDB support is new and upgrade scripts are not available yet." + fi + + + cockroachdb-upgrade: + name: Test CockroachDB upgrade scripts + needs: [build, should-do-database-tests, check_branch, cockroachdb-upgrade-precheck] + runs-on: ubuntu-latest + if: ${{ needs.should-do-database-tests.outputs.check == 'true' || needs.check_branch.outputs.is_publishable_branch == 'true'}} + steps: + - name: Skip CockroachDB upgrade test when scripts are not available yet + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists != 'true' }} + run: 'echo "Skipping cockroachdb-upgrade: CockroachDB support is new and upgrade scripts are not available yet."' + - name: Checkout Openfire + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + uses: actions/checkout@v6 + - name: Set up JDK 17 Zulu + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + uses: actions/setup-java@v5 + with: + java-version: 17 + distribution: zulu + cache: maven + - name: Restore mvn repo artifacts from build job + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + uses: actions/download-artifact@v8 + with: + name: Maven Repository + path: ~/.m2/repository/org/igniterealtime/openfire/ + - name: Set environment variables + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + run: | + echo "CONNECTION_STRING=jdbc:postgresql://localhost:26257/openfire?sslmode=disable" >> $GITHUB_ENV + echo "CONNECTION_DRIVER=org.postgresql.Driver" >> $GITHUB_ENV + echo "CONNECTION_USERNAME=root" >> $GITHUB_ENV + echo "CONNECTION_PASSWORD=" >> $GITHUB_ENV + OPENFIREVSN=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout) + echo "OPENFIREVSN=$OPENFIREVSN" >> $GITHUB_ENV + echo "JAVA_HOME=$(echo $JAVA_HOME_17_X64)" >> $GITHUB_ENV + - name: Download an old Openfire database installation script + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + run: | + mkdir olddb + curl https://raw.githubusercontent.com/igniterealtime/Openfire/v5.1.0/distribution/src/database/openfire_cockroachdb.sql > $GITHUB_WORKSPACE/olddb/openfire_cockroachdb.sql + - name: Start database server, install old version of the Openfire database + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + run: | + docker compose -f ./build/ci/compose/cockroachdb.yml up --wait + docker compose -f ./build/ci/compose/cockroachdb.yml exec db /cockroach/cockroach sql --insecure --execute="CREATE DATABASE openfire;" + docker compose -f ./build/ci/compose/cockroachdb.yml exec -T db /cockroach/cockroach sql --insecure --database=openfire < "$GITHUB_WORKSPACE/olddb/openfire_cockroachdb.sql" + - name: Execute Openfire's database upgrade scripts + if: ${{ needs.cockroachdb-upgrade-precheck.outputs.upgrade-dir-exists == 'true' }} + run: | + pushd ./build/ci/updater + ./mvnw -B clean package exec:java -Dexec.args="$GITHUB_WORKSPACE" + + mysql-install: name: Test MySQL install script needs: [build, should-do-database-tests, check_branch] @@ -768,7 +885,7 @@ jobs: publish-maven: name: Publish to Maven runs-on: ubuntu-latest - needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade] + needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, cockroachdb-install, cockroachdb-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade] if: ${{github.repository == 'igniterealtime/Openfire' && github.event_name == 'push' && needs.check_branch.outputs.is_publishable_branch == 'true'}} steps: @@ -795,7 +912,7 @@ jobs: publish-docker: name: Publish to GitHub's Docker registry runs-on: ubuntu-latest - needs: [build-docker, aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade] + needs: [build-docker, aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, cockroachdb-install, cockroachdb-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade] if: | github.event_name == 'push' && (contains(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main') @@ -854,7 +971,7 @@ jobs: build-deb-artifact: name: Generate DEB artifact runs-on: ubuntu-latest - needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade] + needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, cockroachdb-install, cockroachdb-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade] steps: - uses: actions/checkout@v6 with: diff --git a/build/ci/compose/cockroachdb.yml b/build/ci/compose/cockroachdb.yml new file mode 100644 index 0000000000..db8c31791d --- /dev/null +++ b/build/ci/compose/cockroachdb.yml @@ -0,0 +1,14 @@ +version: '3.7' + +services: + db: + image: cockroachdb/cockroach:latest-v24.3 + command: start-single-node --insecure + ports: + - "26257:26257" + healthcheck: + test: [ "CMD", "/cockroach/cockroach", "sql", "--insecure", "-e", "select 1" ] + interval: 5s + timeout: 10s + retries: 30 + diff --git a/build/ci/updater/src/main/java/com/igniterealtime/openfire/updaterunner/Main.java b/build/ci/updater/src/main/java/com/igniterealtime/openfire/updaterunner/Main.java index e5706163f8..773f68714c 100644 --- a/build/ci/updater/src/main/java/com/igniterealtime/openfire/updaterunner/Main.java +++ b/build/ci/updater/src/main/java/com/igniterealtime/openfire/updaterunner/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2025 Ignite Realtime Foundation. All rights reserved. + * Copyright (C) 2021-2026 Ignite Realtime Foundation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -49,6 +49,7 @@ public static void main(String[] args) throws Exception "Oracle","oracle.jdbc.driver.OracleDriver","jdbc:oracle:thin:@HOSTNAME:1521:SID" "Microsoft SQL Server (legacy)","net.sourceforge.jtds.jdbc.Driver","jdbc:jtds:sqlserver://HOSTNAME/DATABASENAME;appName=Openfire" "PostgreSQL","org.postgresql.Driver","jdbc:postgresql://HOSTNAME:5432/DATABASENAME" + "CockroachDB","org.postgresql.Driver","jdbc:postgresql://HOSTNAME:26257/DATABASENAME?sslmode=disable" "IBM DB2","com.ibm.db2.jcc.DB2Driver","jdbc:db2://HOSTNAME:50000/DATABASENAME" "Microsoft SQL Server","com.microsoft.sqlserver.jdbc.SQLServerDriver","jdbc:sqlserver://HOSTNAME:1433;databaseName=DATABASENAME;applicationName=Openfire" */ diff --git a/distribution/src/database/openfire_cockroachdb.sql b/distribution/src/database/openfire_cockroachdb.sql new file mode 100644 index 0000000000..4a088b3899 --- /dev/null +++ b/distribution/src/database/openfire_cockroachdb.sql @@ -0,0 +1,401 @@ + +-- Note: CockroachDB is accessed via the standard PostgreSQL JDBC driver. + +CREATE TABLE ofUser ( + username VARCHAR(64) NOT NULL, + storedKey VARCHAR(32), + serverKey VARCHAR(32), + salt VARCHAR(32), + iterations INTEGER, + plainPassword VARCHAR(32), + encryptedPassword VARCHAR(255), + name VARCHAR(100), + email VARCHAR(100), + creationDate CHAR(15) NOT NULL, + modificationDate CHAR(15) NOT NULL, + CONSTRAINT ofUser_pk PRIMARY KEY (username) +); +CREATE INDEX ofUser_cDate_idx ON ofUser (creationDate); + + +CREATE TABLE ofUserProp ( + username VARCHAR(64) NOT NULL, + name VARCHAR(100) NOT NULL, + propValue TEXT NOT NULL, + CONSTRAINT ofUserProp_pk PRIMARY KEY (username, name) +); + + +CREATE TABLE ofUserFlag ( + username VARCHAR(64) NOT NULL, + name VARCHAR(100) NOT NULL, + startTime CHAR(15), + endTime CHAR(15), + CONSTRAINT ofUserFlag_pk PRIMARY KEY (username, name) +); +CREATE INDEX ofUserFlag_sTime_idx ON ofUserFlag (startTime); +CREATE INDEX ofUserFlag_eTime_idx ON ofUserFlag (endTime); + + +CREATE TABLE ofOffline ( + username VARCHAR(64) NOT NULL, + messageID INTEGER NOT NULL, + creationDate CHAR(15) NOT NULL, + messageSize INTEGER NOT NULL, + stanza TEXT NOT NULL, + CONSTRAINT ofOffline_pk PRIMARY KEY (username, messageID) +); + + +CREATE TABLE ofPresence ( + username VARCHAR(64) NOT NULL, + offlinePresence TEXT, + offlineDate VARCHAR(15) NOT NULL, + CONSTRAINT ofPresence_pk PRIMARY KEY (username) +); + + +CREATE TABLE ofRoster ( + rosterID INTEGER NOT NULL, + username VARCHAR(64) NOT NULL, + jid VARCHAR(1024) NOT NULL, + sub INTEGER NOT NULL, + ask INTEGER NOT NULL, + recv INTEGER NOT NULL, + nick VARCHAR(255), + stanza TEXT, + CONSTRAINT ofRoster_pk PRIMARY KEY (rosterID) +); +CREATE INDEX ofRoster_username_idx ON ofRoster (username); +CREATE INDEX ofRoster_jid_idx ON ofRoster (jid); + + +CREATE TABLE ofRosterGroups ( + rosterID INTEGER NOT NULL, + rank INTEGER NOT NULL, + groupName VARCHAR(255) NOT NULL, + CONSTRAINT ofRosterGroups_pk PRIMARY KEY (rosterID, rank) +); +CREATE INDEX ofRosterGroups_rosterID_idx ON ofRosterGroups (rosterID); +ALTER TABLE ofRosterGroups ADD CONSTRAINT ofRosterGroups_rosterID_fk FOREIGN KEY (rosterID) REFERENCES ofRoster; + + +CREATE TABLE ofVCard ( + username VARCHAR(64) NOT NULL, + vcard TEXT NOT NULL, + CONSTRAINT ofVCard_pk PRIMARY KEY (username) +); + + +CREATE TABLE ofGroup ( + groupName VARCHAR(50) NOT NULL, + description VARCHAR(255), + CONSTRAINT ofGroup_pk PRIMARY KEY (groupName) +); + + +CREATE TABLE ofGroupProp ( + groupName VARCHAR(50) NOT NULL, + name VARCHAR(100) NOT NULL, + propValue TEXT NOT NULL, + CONSTRAINT ofGroupProp_pk PRIMARY KEY (groupName, name) +); + + +CREATE TABLE ofGroupUser ( + groupName VARCHAR(50) NOT NULL, + username VARCHAR(100) NOT NULL, + administrator INTEGER NOT NULL, + CONSTRAINT ofGroupUser_pk PRIMARY KEY (groupName, username, administrator) +); + + +CREATE TABLE ofID ( + idType INTEGER NOT NULL, + id INTEGER NOT NULL, + CONSTRAINT ofID_pk PRIMARY KEY (idType) +); + + +CREATE TABLE ofProperty ( + name VARCHAR(100) NOT NULL, + propValue VARCHAR(4000) NOT NULL, + encrypted INTEGER, + iv CHAR(24), + CONSTRAINT ofProperty_pk PRIMARY KEY (name) +); + + +CREATE TABLE ofVersion ( + name VARCHAR(50) NOT NULL, + version INTEGER NOT NULL, + CONSTRAINT ofVersion_pk PRIMARY KEY (name) +); + +CREATE TABLE ofExtComponentConf ( + subdomain VARCHAR(255) NOT NULL, + wildcard INTEGER NOT NULL, + secret VARCHAR(255), + permission VARCHAR(10) NOT NULL, + CONSTRAINT ofExtComponentConf_pk PRIMARY KEY (subdomain) +); + +CREATE TABLE ofRemoteServerConf ( + xmppDomain VARCHAR(255) NOT NULL, + remotePort INTEGER, + permission VARCHAR(10) NOT NULL, + CONSTRAINT ofRemoteServerConf_pk PRIMARY KEY (xmppDomain) +); + +CREATE TABLE ofPrivacyList ( + username VARCHAR(64) NOT NULL, + name VARCHAR(100) NOT NULL, + isDefault INTEGER NOT NULL, + list TEXT NOT NULL, + CONSTRAINT ofPrivacyList_pk PRIMARY KEY (username, name) +); +CREATE INDEX ofPrivacyList_default_idx ON ofPrivacyList (username, isDefault); + +CREATE TABLE ofSecurityAuditLog ( + msgID INTEGER NOT NULL, + username VARCHAR(64) NOT NULL, + entryStamp BIGINT NOT NULL, + summary VARCHAR(255) NOT NULL, + node VARCHAR(255) NOT NULL, + details TEXT, + CONSTRAINT ofSecurityAuditLog_pk PRIMARY KEY (msgID) +); +CREATE INDEX ofSecurityAuditLog_tstamp_idx ON ofSecurityAuditLog (entryStamp); +CREATE INDEX ofSecurityAuditLog_uname_idx ON ofSecurityAuditLog (username); + +-- MUC Tables + +CREATE TABLE ofMucService ( + serviceID INTEGER NOT NULL, + subdomain VARCHAR(255) NOT NULL, + description VARCHAR(255), + isHidden INTEGER NOT NULL, + CONSTRAINT ofMucService_pk PRIMARY KEY (subdomain) +); +CREATE INDEX ofMucService_serviceid_idx ON ofMucService(serviceID); + +CREATE TABLE ofMucServiceProp ( + serviceID INTEGER NOT NULL, + name VARCHAR(100) NOT NULL, + propValue TEXT NOT NULL, + CONSTRAINT ofMucServiceProp_pk PRIMARY KEY (serviceID, name) +); + +CREATE TABLE ofMucRoom ( + serviceID INTEGER NOT NULL, + roomID INTEGER NOT NULL, + creationDate CHAR(15) NOT NULL, + modificationDate CHAR(15) NOT NULL, + name VARCHAR(50) NOT NULL, + naturalName VARCHAR(255) NOT NULL, + description VARCHAR(255), + lockedDate CHAR(15) NOT NULL, + emptyDate CHAR(15) NULL, + canChangeSubject INTEGER NOT NULL, + maxUsers INTEGER NOT NULL, + publicRoom INTEGER NOT NULL, + moderated INTEGER NOT NULL, + membersOnly INTEGER NOT NULL, + canInvite INTEGER NOT NULL, + roomPassword VARCHAR(50) NULL, + canDiscoverJID INTEGER NOT NULL, + logEnabled INTEGER NOT NULL, + retireOnDeletion INTEGER NOT NULL, + preserveHistOnDel INTEGER NOT NULL, + subject TEXT NULL, + rolesToBroadcast INTEGER NOT NULL, + useReservedNick INTEGER NOT NULL, + canChangeNick INTEGER NOT NULL, + canRegister INTEGER NOT NULL, + allowpm INTEGER NULL, + fmucEnabled INTEGER NULL, + fmucOutboundNode TEXT NULL, + fmucOutboundMode INTEGER NULL, + fmucInboundNodes TEXT NULL, + CONSTRAINT ofMucRoom_pk PRIMARY KEY (serviceID, name) +); +CREATE INDEX ofMucRoom_roomid_idx ON ofMucRoom(roomID); +CREATE INDEX ofMucRoom_serviceid_idx ON ofMucRoom(serviceID); + +CREATE TABLE ofMucRoomProp ( + roomID INTEGER NOT NULL, + name VARCHAR(100) NOT NULL, + propValue TEXT NOT NULL, + CONSTRAINT ofMucRoomProp_pk PRIMARY KEY (roomID, name) +); + +CREATE TABLE ofMucRoomRetiree ( + serviceID INTEGER NOT NULL, + name VARCHAR(50) NOT NULL, + alternateJID VARCHAR(2000), + reason VARCHAR(1024), + retiredAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT ofMucRoomRetiree_pk PRIMARY KEY (serviceID, name) +); + +CREATE TABLE ofMucAffiliation ( + roomID INTEGER NOT NULL, + jid VARCHAR(1024) NOT NULL, + affiliation INTEGER NOT NULL, + CONSTRAINT ofMucAffiliation_pk PRIMARY KEY (roomID,jid) +); + +CREATE TABLE ofMucMember ( + roomID INTEGER NOT NULL, + jid VARCHAR(1024) NOT NULL, + nickname VARCHAR(255) NULL, + firstName VARCHAR(100) NULL, + lastName VARCHAR(100) NULL, + url VARCHAR(100) NULL, + email VARCHAR(100) NULL, + faqentry VARCHAR(100) NULL, + CONSTRAINT ofMucMember_pk PRIMARY KEY (roomID,jid) +); + +CREATE TABLE ofMucConversationLog ( + roomID INTEGER NOT NULL, + messageID INTEGER NOT NULL, + sender VARCHAR(1024) NOT NULL, + nickname VARCHAR(255) NULL, + logTime CHAR(15) NOT NULL, + subject VARCHAR(255) NULL, + body TEXT NULL, + stanza TEXT NULL +); +CREATE INDEX ofMucConversationLog_roomtime_idx ON ofMucConversationLog (roomID, logTime); +CREATE INDEX ofMucConversationLog_time_idx ON ofMucConversationLog (logTime); +CREATE INDEX ofMucConversationLog_msg_id ON ofMucConversationLog (messageID); + + +-- PubSub Tables + +CREATE TABLE ofPubsubNode ( + serviceID VARCHAR(100) NOT NULL, + nodeID VARCHAR(100) NOT NULL, + leaf INTEGER NOT NULL, + creationDate CHAR(15) NOT NULL, + modificationDate CHAR(15) NOT NULL, + parent VARCHAR(100) NULL, + deliverPayloads INTEGER NOT NULL, + maxPayloadSize INTEGER NULL, + persistItems INTEGER NULL, + maxItems INTEGER NULL, + notifyConfigChanges INTEGER NOT NULL, + notifyDelete INTEGER NOT NULL, + notifyRetract INTEGER NOT NULL, + presenceBased INTEGER NOT NULL, + sendItemSubscribe INTEGER NOT NULL, + publisherModel VARCHAR(15) NOT NULL, + subscriptionEnabled INTEGER NOT NULL, + configSubscription INTEGER NOT NULL, + accessModel VARCHAR(10) NOT NULL, + payloadType VARCHAR(100) NULL, + bodyXSLT VARCHAR(100) NULL, + dataformXSLT VARCHAR(100) NULL, + creator VARCHAR(1024) NOT NULL, + description VARCHAR(255) NULL, + language VARCHAR(255) NULL, + name VARCHAR(50) NULL, + replyPolicy VARCHAR(15) NULL, + associationPolicy VARCHAR(15) NULL, + maxLeafNodes INTEGER NULL, + CONSTRAINT ofPubsubNode_pk PRIMARY KEY (serviceID, nodeID) +); + +CREATE TABLE ofPubsubNodeJIDs ( + serviceID VARCHAR(100) NOT NULL, + nodeID VARCHAR(100) NOT NULL, + jid VARCHAR(1024) NOT NULL, + associationType VARCHAR(20) NOT NULL, + CONSTRAINT ofPubsubNodeJIDs_pk PRIMARY KEY (serviceID, nodeID, jid) +); + +CREATE TABLE ofPubsubNodeGroups ( + serviceID VARCHAR(100) NOT NULL, + nodeID VARCHAR(100) NOT NULL, + rosterGroup VARCHAR(100) NOT NULL +); +CREATE INDEX ofPubsubNodeGroups_idx ON ofPubsubNodeGroups (serviceID, nodeID); + +CREATE TABLE ofPubsubAffiliation ( + serviceID VARCHAR(100) NOT NULL, + nodeID VARCHAR(100) NOT NULL, + jid VARCHAR(1024) NOT NULL, + affiliation VARCHAR(10) NOT NULL, + CONSTRAINT ofPubsubAffiliation_pk PRIMARY KEY (serviceID, nodeID, jid) +); + +CREATE TABLE ofPubsubItem ( + serviceID VARCHAR(100) NOT NULL, + nodeID VARCHAR(100) NOT NULL, + id VARCHAR(100) NOT NULL, + jid VARCHAR(1024) NOT NULL, + creationDate CHAR(15) NOT NULL, + payload TEXT NULL, + CONSTRAINT ofPubsubItem_pk PRIMARY KEY (serviceID, nodeID, id) +); + +CREATE TABLE ofPubsubSubscription ( + serviceID VARCHAR(100) NOT NULL, + nodeID VARCHAR(100) NOT NULL, + id VARCHAR(100) NOT NULL, + jid VARCHAR(1024) NOT NULL, + owner VARCHAR(1024) NOT NULL, + state VARCHAR(15) NOT NULL, + deliver INTEGER NOT NULL, + digest INTEGER NOT NULL, + digest_frequency INTEGER NOT NULL, + expire CHAR(15) NULL, + includeBody INTEGER NOT NULL, + showValues VARCHAR(30) NOT NULL, + subscriptionType VARCHAR(10) NOT NULL, + subscriptionDepth INTEGER NOT NULL, + keyword VARCHAR(200) NULL, + CONSTRAINT ofPubsubSubscription_pk PRIMARY KEY (serviceID, nodeID, id) +); + +CREATE TABLE ofPubsubDefaultConf ( + serviceID VARCHAR(100) NOT NULL, + leaf INTEGER NOT NULL, + deliverPayloads INTEGER NOT NULL, + maxPayloadSize INTEGER NOT NULL, + persistItems INTEGER NOT NULL, + maxItems INTEGER NOT NULL, + notifyConfigChanges INTEGER NOT NULL, + notifyDelete INTEGER NOT NULL, + notifyRetract INTEGER NOT NULL, + presenceBased INTEGER NOT NULL, + sendItemSubscribe INTEGER NOT NULL, + publisherModel VARCHAR(15) NOT NULL, + subscriptionEnabled INTEGER NOT NULL, + accessModel VARCHAR(10) NOT NULL, + language VARCHAR(255) NULL, + replyPolicy VARCHAR(15) NULL, + associationPolicy VARCHAR(15) NOT NULL, + maxLeafNodes INTEGER NOT NULL, + CONSTRAINT ofPubsubDefaultConf_pk PRIMARY KEY (serviceID, leaf) +); + +-- Finally, insert default table values. + +INSERT INTO ofID (idType, id) VALUES (18, 1); +INSERT INTO ofID (idType, id) VALUES (19, 1); +INSERT INTO ofID (idType, id) VALUES (23, 1); +INSERT INTO ofID (idType, id) VALUES (26, 2); +INSERT INTO ofID (idType, id) VALUES (27, 1); + +-- Entry for admin user +INSERT INTO ofUser (username, plainPassword, name, email, creationDate, modificationDate) + VALUES ('admin', 'admin', 'Administrator', 'admin@example.com', '0', '0'); + +-- Entry for default conference service +INSERT INTO ofMucService (serviceID, subdomain, isHidden) VALUES (1, 'conference', 0); + +-- Do this last, as it is used by a continuous integration check to verify that the entire script was executed successfully. +INSERT INTO ofVersion (name, version) VALUES ('openfire', 38); + diff --git a/documentation/database.html b/documentation/database.html index 40901bfac0..b1bf5202b5 100644 --- a/documentation/database.html +++ b/documentation/database.html @@ -28,7 +28,7 @@
JDBC drivers are required for Openfire to communicate with your database. Suggested drivers for particular databases are noted below where applicable. Openfire bundles JDBC drivers for MySQL, Oracle, PostgreSQL, - Microsoft SQL Server, and HSQLDB. + CockroachDB, Microsoft SQL Server, and HSQLDB.
All supported database schemas can be found in the resources/database directory of the
@@ -48,6 +48,7 @@
+ CockroachDB is wire-protocol compatible with PostgreSQL. The PostgreSQL JDBC driver bundled with + Openfire can be used to connect to CockroachDB without installing a separate driver. +
++ In the Openfire web-based setup tool, use the following values: +
+org.postgresql.Driverjdbc:postgresql://HOSTNAME:26257/DATABASENAME
+ The default CockroachDB port is 26257. You can optionally add an sslmode
+ parameter to the JDBC URL to match your CockroachDB TLS configuration. For secure deployments, use a
+ secure mode such as sslmode=require (or verify-full with appropriate
+ certificates). Use sslmode=disable only when connecting to a CockroachDB cluster started
+ with --insecure for local development.
+
cockroach sql --execute="CREATE DATABASE openfire;"cockroach sql --execute="CREATE USER openfireuser WITH PASSWORD 'secret'; GRANT ALL ON DATABASE openfire TO openfireuser;"