Commit 1466a1e9 authored by Gaston Dombiak's avatar Gaston Dombiak Committed by gato

Initial port from enterprise edition.

git-svn-id: http://svn.igniterealtime.org/svn/repos/openfire/branches/openfire_3_5_2@10384 b35dd754-fafc-0310-a699-88a17e54d16e
parent 12ed88c4
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Client Control Plugin Changelog</title>
<style type="text/css">
BODY {
font-size : 100%;
}
BODY, TD, TH {
font-family : tahoma, verdana, arial, helvetica, sans-serif;
font-size : 0.8em;
}
H2 {
font-size : 10pt;
font-weight : bold;
padding-left : 1em;
}
A:hover {
text-decoration : none;
}
H1 {
font-family : tahoma, arial, helvetica, sans-serif;
font-size : 1.4em;
font-weight: bold;
border-bottom : 1px #ccc solid;
padding-bottom : 2px;
}
TT {
font-family : courier new;
font-weight : bold;
color : #060;
}
PRE {
font-family : courier new;
font-size : 100%;
}
</style>
</head>
<body>
<h1>
Client Control Plugin Changelog
</h1>
<p><b>1.0.0</b> -- May 13, 2008</p>
<ul>
<li>Functionality ported from Openfire Enterprise, now Open Source.</li>
</ul>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<!-- Main plugin class -->
<class>org.jivesoftware.openfire.plugin.ClientControlPlugin</class>
<!-- Plugin meta-data -->
<name>Client Control</name>
<description>Controls clients allowed to connect and available features</description>
<author>Jive Software</author>
<version>1.0.0</version>
<date>6/13/2008</date>
<minServerVersion>3.5.0</minServerVersion>
<databaseKey>clientcontrol</databaseKey>
<databaseVersion>0</databaseVersion>
<!-- UI extension -->
<adminconsole>
<tab id="tab-server">
<sidebar id="client" name="${admin.sidebar.client.name}" description="${admin.sidebar.client.description}">
<item id="client-features" name="${admin.item.client-features.name}"
url="client-features.jsp"
description="${admin.item.client-features.description}"/>
<item id="client-version" name="${admin.item.client-version.name}"
url="permitted-clients.jsp"
description="${admin.item.client-version.description}"/>
<item id="groupchat-bookmarks" name="${admin.item.groupchat-bookmarks.name}"
url="groupchat-bookmarks.jsp"
description="${admin.item.groupchat-bookmarks.description}"/>
<item id="url-bookmarks" name="${admin.item.url-bookmarks.name}"
url="url-bookmarks.jsp"
description="${admin.item.url-bookmarks.description}"/>
<item id="spark-version" name="${admin.item.spark-version.name}"
url="spark-form.jsp"
description="${admin.item.spark-version.description}"/>
<item id="spark-download" name="${admin.item.spark-download.name}"
url="spark-download.jsp"
description="${admin.item.spark-download.description}"/>
</sidebar>
</tab>
</adminconsole>
</plugin>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Client Control Plugin Readme</title>
<style type="text/css">
BODY {
font-size : 100%;
}
BODY, TD, TH {
font-family : tahoma, verdana, arial, helvetica, sans-serif;
font-size : 0.8em;
}
H2 {
font-size : 10pt;
font-weight : bold;
}
A:hover {
text-decoration : none;
}
H1 {
font-family : tahoma, arial, helvetica, sans-serif;
font-size : 1.4em;
font-weight: bold;
border-bottom : 1px #ccc solid;
padding-bottom : 2px;
}
TT {
font-family : courier new;
font-weight : bold;
color : #060;
}
PRE {
font-family : courier new;
font-size : 100%;
}
#datatable TH {
color : #fff;
background-color : #2A448C;
text-align : left;
}
#datatable TD {
background-color : #FAF6EF;
}
#datatable .name {
background-color : #DCE2F5;
}
</style>
</head>
<body>
<h1>
Client Control Plugin Readme
</h1>
<h2>Overview</h2>
<p>
The client control plugin allows to specify which XMPP clients are allowed to connect to the server; which
client features are enabled; manage groupchat and URL bookmarks and control which Spark version should be
used by clients.
</p>
<h2>Installation</h2>
<p>
Copy clientControl.jar into the plugins directory of your Openfire installation.
The plugin will then be automatically deployed. To upgrade to a new version,
copy the new clientControl.jar file over the existing file.
</p>
<h2>Upgrading from Enterprise</h2>
<p>
If you are upgrading from the Enterprise plugin, and wish to keep your old
bookmarks, you will need to manually run some database scripts to
perform the migration. Note, if you don't care about your previous
bookmarks, you don't have to worry about these steps.
</p>
<p>
First, you will need to shut down your Openfire server and remove the
enterprise plugin. To do this, perform the following steps:
<ol>
<li>Shut down your Openfire server</li>
<li>Remove the <b>enterprise.jar</b> file and the <b>enterprise</b> directory from the plugins directory in your Openfire install root</li>
<li>Install this plugin, <b>clientControl.jar</b> by copying it into the plugins directory.</li>
<li>At this point, you will need to start up Openfire and let it extract and install the <b>clientControl</b> plugin. You can watch for this to occur by looking under the Plugins tab in the Openfire admin console. Once it appears in the list, continue to the next step.</li>
<li>Shut the server back down again.</li>
<li>Go into your plugins/clientControl/database directory. There you will see
some scripts prefixed with <b>import_</b>. Log into your database, switch
to the Openfire's database as you configured during setup (you can find
this information in conf/openfire.xml if you don't remember it), and run
the script that matches the database you are using. Note that the embedded
database is hsqldb and you can use the script in bin/extra from the Openfire
install root (bin/extra/embedded-db-viewer.sh or
bin/extra/embedded-db-viewer.bat, depending on whether you are using Windows)
to access your embedded database.</li>
<li>Once the script has completed, you can start Openfire back up and all of your settings should be the way they were when you were running the Enterprise plugin.</li>
</ol>
</p>
</body>
</html>
-- $Revision$
-- $Date$
INSERT INTO jiveVersion (name, version) VALUES ('clientcontrol', 0);
CREATE TABLE ofBookmark (
bookmarkID INTEGER NOT NULL,
bookmarkType VARCHAR(50) NOT NULL,
bookmarkName VARCHAR(255) NOT NULL,
bookmarkValue VARCHAR(1024) NOT NULL,
isGlobal INTEGER NOT NULL,
CONSTRAINT ofBookmark_pk PRIMARY KEY (bookmarkID)
);
CREATE TABLE ofBookmarkPerm (
bookmarkID INTEGER NOT NULL,
bookmarkType INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
CONSTRAINT ofBookmarkPerm_pk PRIMARY KEY(bookmarkID, name, bookmarkType)
);
CREATE TABLE ofBookmarkProp (
bookmarkID INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
propValue LONG VARCHAR NOT NULL,
CONSTRAINT ofBookmarkProp_pk PRIMARY KEY (bookmarkID, name)
);
// $Revision$
// $Date$
INSERT INTO jiveVersion (name, version) VALUES ('clientcontrol', 0);
CREATE TABLE ofBookmark (
bookmarkID BIGINT NOT NULL,
bookmarkType VARCHAR(50) NOT NULL,
bookmarkName VARCHAR(255) NOT NULL,
bookmarkValue VARCHAR(1024) NOT NULL,
isGlobal INT NOT NULL,
CONSTRAINT ofBookmark_pk PRIMARY KEY (bookmarkID)
);
CREATE TABLE ofBookmarkPerm (
bookmarkID BIGINT NOT NULL,
bookmarkType INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
CONSTRAINT ofBookmarkPerm_pk PRIMARY KEY(bookmarkID, name, bookmarkType)
);
CREATE TABLE ofBookmarkProp (
bookmarkID BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
propValue LONGVARCHAR NOT NULL,
CONSTRAINT ofBookmarkProp_pk PRIMARY KEY (bookmarkID, name)
);
# $Revision$
# $Date$
INSERT INTO jiveVersion (name, version) VALUES ('clientcontrol', 0);
CREATE TABLE ofBookmark (
bookmarkID BIGINT NOT NULL,
bookmarkType VARCHAR(50) NOT NULL,
bookmarkName VARCHAR(255) NOT NULL,
bookmarkValue VARCHAR(255) NOT NULL,
isGlobal INT NOT NULL,
PRIMARY KEY (bookmarkID)
);
CREATE TABLE ofBookmarkPerm (
bookmarkID BIGINT NOT NULL,
bookmarkType TINYINT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(bookmarkID, name, bookmarkType)
);
CREATE TABLE ofBookmarkProp (
bookmarkID BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
propValue TEXT NOT NULL,
PRIMARY KEY (bookmarkID, name)
);
-- $Revision$
-- $Date$
INSERT INTO jiveVersion (name, version) VALUES ('clientcontrol', 0);
CREATE TABLE ofBookmark (
bookmarkID INTEGER NOT NULL,
bookmarkType VARCHAR2(50) NOT NULL,
bookmarkName VARCHAR2(255) NOT NULL,
bookmarkValue VARCHAR2(1024) NOT NULL,
isGlobal INT NOT NULL,
CONSTRAINT ofBookmark_pk PRIMARY KEY (bookmarkID)
);
CREATE TABLE ofBookmarkPerm (
bookmarkID INTEGER NOT NULL,
bookmarkType NUMBER(2) NOT NULL,
name VARCHAR2(255) NOT NULL,
CONSTRAINT ofBookmarkPerm_pk PRIMARY KEY(bookmarkID, name, bookmarkType)
);
CREATE TABLE ofBookmarkProp (
bookmarkID INTEGER NOT NULL,
name VARCHAR2(100) NOT NULL,
propValue LONG NOT NULL,
CONSTRAINT ofBookmarkProp_pk PRIMARY KEY (bookmarkID, name)
);
-- $Revision$
-- $Date$
INSERT INTO jiveVersion (name, version) VALUES ('clientcontrol', 0);
CREATE TABLE ofBookmark (
bookmarkID INTEGER NOT NULL,
bookmarkType VARCHAR(50) NOT NULL,
bookmarkName VARCHAR(255) NOT NULL,
bookmarkValue VARCHAR(1024) NOT NULL,
isGlobal INTEGER NOT NULL,
CONSTRAINT ofBookmark_pk PRIMARY KEY (bookmarkID)
);
CREATE TABLE ofBookmarkPerm (
bookmarkID INTEGER NOT NULL,
bookmarkType SMALLINT NOT NULL,
name VARCHAR(255) NOT NULL,
CONSTRAINT ofBookmarkPerm_pk PRIMARY KEY(bookmarkID, name, bookmarkType)
);
CREATE TABLE ofBookmarkProp (
bookmarkID INTEGER NOT NULL,
name VARCHAR(100) NOT NULL,
propValue TEXT NOT NULL,
CONSTRAINT ofBookmarkProp_pk PRIMARY KEY (bookmarkID, name)
);
/* $Revision$ */
/* $Date$ */
INSERT INTO jiveVersion (name, version) VALUES ('clientcontrol', 0);
CREATE TABLE ofBookmark (
bookmarkID BIGINT NOT NULL,
bookmarkType VARCHAR(50) NOT NULL,
bookmarkName NVARCHAR(255) NOT NULL,
bookmarkValue NVARCHAR(1024) NOT NULL,
isGlobal INT NOT NULL,
CONSTRAINT ofBookmark_pk PRIMARY KEY (bookmarkID)
);
CREATE TABLE ofBookmarkPerm (
bookmarkID BIGINT NOT NULL,
bookmarkType TINYINT NOT NULL,
name NVARCHAR(255) NOT NULL,
CONSTRAINT ofBookmarkPerm_pk PRIMARY KEY(bookmarkID, name, bookmarkType)
);
CREATE TABLE ofBookmarkProp (
bookmarkID BIGINT NOT NULL,
name NVARCHAR(100) NOT NULL,
propValue NTEXT NOT NULL,
CONSTRAINT ofBookmarkProp_pk PRIMARY KEY (bookmarkID, name)
);
TRUNCATE TABLE ofBookmark;
INSERT INTO ofBookmark
(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal)
SELECT bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal
FROM entBookmark;
TRUNCATE TABLE ofBookmarkPerm;
INSERT INTO ofBookmarkPerm
(bookmarkID, bookmarkType, name)
SELECT bookmarkID, bookmarkType, name
FROM entBookmarkPerm;
TRUNCATE TABLE ofBookmarkProp;
INSERT INTO ofBookmarkProp
(bookmarkID, name, propValue)
SELECT bookmarkID, name, propValue
FROM entBookmarkProp;
\ No newline at end of file
TRUNCATE TABLE ofBookmark;
INSERT INTO ofBookmark
(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal)
SELECT bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal
FROM entBookmark;
TRUNCATE TABLE ofBookmarkPerm;
INSERT INTO ofBookmarkPerm
(bookmarkID, bookmarkType, name)
SELECT bookmarkID, bookmarkType, name
FROM entBookmarkPerm;
TRUNCATE TABLE ofBookmarkProp;
INSERT INTO ofBookmarkProp
(bookmarkID, name, propValue)
SELECT bookmarkID, name, propValue
FROM entBookmarkProp;
\ No newline at end of file
TRUNCATE TABLE ofBookmark;
INSERT INTO ofBookmark
(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal)
SELECT bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal
FROM entBookmark;
TRUNCATE TABLE ofBookmarkPerm;
INSERT INTO ofBookmarkPerm
(bookmarkID, bookmarkType, name)
SELECT bookmarkID, bookmarkType, name
FROM entBookmarkPerm;
TRUNCATE TABLE ofBookmarkProp;
INSERT INTO ofBookmarkProp
(bookmarkID, name, propValue)
SELECT bookmarkID, name, propValue
FROM entBookmarkProp;
\ No newline at end of file
TRUNCATE TABLE ofBookmark;
INSERT INTO ofBookmark
(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal)
SELECT bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal
FROM entBookmark;
TRUNCATE TABLE ofBookmarkPerm;
INSERT INTO ofBookmarkPerm
(bookmarkID, bookmarkType, name)
SELECT bookmarkID, bookmarkType, name
FROM entBookmarkPerm;
TRUNCATE TABLE ofBookmarkProp;
INSERT INTO ofBookmarkProp
(bookmarkID, name, propValue)
SELECT bookmarkID, name, propValue
FROM entBookmarkProp;
commit;
TRUNCATE TABLE ofBookmark;
INSERT INTO ofBookmark
(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal)
SELECT bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal
FROM entBookmark;
TRUNCATE TABLE ofBookmarkPerm;
INSERT INTO ofBookmarkPerm
(bookmarkID, bookmarkType, name)
SELECT bookmarkID, bookmarkType, name
FROM entBookmarkPerm;
TRUNCATE TABLE ofBookmarkProp;
INSERT INTO ofBookmarkProp
(bookmarkID, name, propValue)
SELECT bookmarkID, name, propValue
FROM entBookmarkProp;
\ No newline at end of file
TRUNCATE TABLE ofBookmark;
INSERT INTO ofBookmark
(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal)
SELECT bookmarkID, bookmarkType, bookmarkName, bookmarkValue, isGlobal
FROM entBookmark;
TRUNCATE TABLE ofBookmarkPerm;
INSERT INTO ofBookmarkPerm
(bookmarkID, bookmarkType, name)
SELECT bookmarkID, bookmarkType, name
FROM entBookmarkPerm;
TRUNCATE TABLE ofBookmarkProp;
INSERT INTO ofBookmarkProp
(bookmarkID, name, propValue)
SELECT bookmarkID, name, propValue
FROM entBookmarkProp;
\ No newline at end of file
# $RCSfile$
# $Revision: 3148 $
# $Date: 2005-12-01 14:50:45 -0300 (Thu, 01 Dec 2005) $
##
## Enterprise Resource Bundle
##
## Additional locales can be specified by creating a new resource file in this
## directory using the following conventions:
##
## enterprise_i18n "_" language "_" country ".properties"
## enterprise_i18n "_" language ".properties"
##
## e.g.
## enterprise_i18n_en.propertis <- English resources
## enterprise_i18n_en_US.properties <- American US resources
## enterprise_i18n_de.properties <- German resources
## enterprise_i18n_ja.properties <- Japanese resources
##
## Please note that the two digit language code should be lower case, and the
## two digit country code should be in uppercase. Often, it is not necessary to
## specify the country code.
##
## A full list of language codes can be found at
## http://www-old.ics.uci.edu/pub/ietf/http/related/iso639.txt
## and a full list of country codes can be found at
## http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
##
## In property strings that are parameterized, single quotes can be used to
## quote the "{" (curly brace) if necessary. A real single quote is represented by ''.
##
## REVISION HISTORY (by Enterprise version):
##
## 3.0.0
## Initial Release
##
## 3.1.1
## Added key: 'license.error.no_license'
## Updated key: 'license.error.not_found'
##
## 3.2.0
## Added key: 'admin.item.sipark'
## Added key: 'admin.item.sipark.user.name'
## Added key: 'admin.item.sipark.user.description'
## Added key: 'admin.item.sipark.settings.name'
## Added key: 'admin.item.sipark.settings.description'
## Added key: 'admin.item.sipark.calls.name'
## Added key: 'admin.item.sipark.calls.description'
## Added key: 'license.error.no_license'
## Added key: 'license.expiration.header'
## Added key: 'license.expiration.body'
## Added key: 'license.maintenance.header'
## Added key: 'license.maintenance.body'
## Added key: 'permitted.client.website'
## Added section: 'sipark.settings.*'
## Added section: 'sipark.user.*'
## Added section: 'sip.account.*'
## Added section: 'call.summary.*'
## Added section: 'call.type.*'
## Added key: 'global.showing'
## Added key: 'global.pages'
##
## 3.3.0
## Added key: 'archive.settings.one_to_one'
## Added key: 'archive.settings.group_chats'
## Added key: 'archive.settings.certain_rooms'
## Updated key: 'admin.tab.enterprise.description'
## Updated key: 'admin.sidebar.statistics.description'
## Updated key: 'admin.sidebar.archiving.description'
## Updated key: 'admin.sidebar.general.description'
## Updated key: 'license.eval.body'
## Updated key: 'license.expiration.body'
## Updated key: 'license.maintenance.body'
## Updated key: 'license.details'
## Updated key: 'spark.download.emailtemplate.template.part1'
## Updated key: 'stat.packet_count.desc'
## Updated key: 'dashboard.title'
## Updated key: 'dashboard.description'
##
## 3.5.0
## Added key: 'sparkweb.launch.title'
## Added key: 'sparkweb.launch.instructions'
## Updated key: 'admin.item.sparkweb.description'
## Added key: 'sparkweb.launch.launchurl'
# Enterprise
login.title = Admin Console
error.exception = Exception:
plugin.name=Openfire Enterprise
plugin.description=Enterprise Edition of Openfire.
admin.tab.enterprise.name=Enterprise
admin.tab.enterprise.description=Enterprise Server
admin.sidebar.statistics.name=Statistics
admin.sidebar.statistics.description=Enterprise Statistics
admin.item.stats-dashboard.name=Dashboard
admin.item.stats-dashboard.description=View overview of server statistics.
admin.item.stats-reporter.name=All Reports
admin.item.stats-reporter.description=View detailed reports of server statistics.
admin.sidebar.archiving.name=Archiving
admin.sidebar.archiving.description=Enterprise Archiving Settings
admin.item.archive-search.name=Search Archive
admin.item.archive-search.description=Click to search archive.
admin.item.archive-settings.name=Archiving Settings
admin.item.archive-settings.description=Click to configure archiving.
admin.item.active-conversations.name=Conversations
admin.item.active-conversations.description=Click to view active conversations.
admin.sidebar.client.name=Client Management
admin.sidebar.client.description=Manage Client Features and Spark Deployments
admin.item.client-features.name=Client Features
admin.item.client-features.description=Click to enable and disable client features.
admin.item.client-version.name=Permitted Clients
admin.item.client-version.description=Click to configure which client applications can connect to \
your server.
admin.item.groupchat-bookmarks.name=Group Chat Bookmarks
admin.item.groupchat-bookmarks.description=Click to manage group chat bookmarks for users.
admin.item.url-bookmarks.name=URL Bookmarks
admin.item.url-bookmarks.description=Click to manage URL bookmarks for users.
admin.item.spark-version.name=Spark Version
admin.item.spark-version.description=Click to set the Spark client version for each platform.
admin.item.spark-download.name=Download Spark
admin.item.spark-download.description=Download Spark.
admin.item.webclient=Web Client
admin.item.webclient.description=
admin.item.sparkweb.name=SparkWeb
admin.item.sparkweb.description=Click to find information on launching SparkWeb.
admin.sidebar.general.name=General
admin.sidebar.general.description=Enterprise General Settings
admin.item.license.name=License Information
admin.item.license.description=Click to view license information.
license.eval.header = Days Remaining in Evaluation: {0}
license.eval.body = Your evaluation of Openfire Enterprise expires in {0} day(s). Contact \
our {1}sales department{2} to purchase a license.
license.expiration.header = Days Until License Expires: {0}
license.expiration.body = Your Openfire Enterprise license will expire in {0} day(s). Please \
contact our {1}sales team{2} to purchase a new license.
license.maintenance.header = Days Until Maintenance Expires: {0}
license.maintenance.body = Your Openfire Enterprise maintenance will expire in {0} day(s). Please \
contact our {1}sales team{2} to purchase a new license.
license.eval.mini.multi_day = {0} days
license.eval.mini.single_day = 1 day
license.shrink = Shrink
license.expand = Expand
license.title = License Information
license.error = License Error
license.error.no_license = No License Found
license.error.parse_error = The license text could not be parsed. Please paste in a full license.
license.error.expired = The license has expired. Please enter an updated license.
license.error.invalid = The license file is invalid or corrupted. Please enter a valid license.
license.error.default = An error occurred validating the license file. Please enter a valid license.
license.error.not_found = <p>No license file was found. Please enter a license file below.</p>\
<p><b>Need an evaluation license?</b> Register for a 30-day evaluation license at \
<a href="http://www.jivesoftware.com/products/openfire/eval_landing.jsp" target="_blank">jivesoftware.com</a>.</p>
license.error.too_many_users = You have exceeded the maximum number of users your license allows. \
Disconnect users or enter a new license file.
license.updated = License updated successfully.
license.details = Enterprise License Details
license.display.type = License Type
license.display.expires = License Expires
license.display.created = License Created
license.display.max_users = Maximum Users
license.display.members = Cluster Members
license.display.no_expires_date = Never
license.display.no_creation_date = Unknown
license.new_license.title = Enter License
license.new_license.description = To enter your license key, copy and paste the contents of \
your enterprise.license file into the field below.
license.update_license.update = Update License
license.update_license.cancel = Cancel
license.update_license.title = Update License
license.update_license.description = Copy and paste the contents of your enterprise.license file \
into the field below.
license.alt = Alternatively, you can copy the enterprise.license file to the \
following location (may require restart of the server to take effect)
license.submit = Submit
# Enteprise Spark Manager
client.features.title = Client Features
client.feature = Feature
client.features.spark.only = (Spark Only)
client.features.update.features = Client feature permissions have been updated.
client.features.info = Use the form below to enable or disable client features. \
Note: Some of the client restrictions only apply to the Spark client.
client.features.broadcasting = Broadcasting
client.features.broadcasting.description = Allow for broadcasting of messages to specified groups or entire roster.
client.features.enabled = Enabled
client.features.disabled = Disabled
client.features.filetransfer = File Transfer
client.features.filetransfer.description = Allow for sending of files from one user to another.
client.features.groupchat = Group Chat
client.features.groupchat.description = Allow for joining of Group Chat rooms.
client.features.vcard = Avatar/VCard
client.features.vcard.description = Allow users to change their profiles and avatars.
client.features.save.settings = Save Settings
permitted.client.title = Permitted Clients
permitted.client.description = Use the form below to restrict client access.
permitted.client.success = Client version settings have been updated.
permitted.client.legend = Clients Allowed to Connect
permitted.client.all.clients = All Clients
permitted.client.all.clients.description = Allow all XMPP clients to connect. This is the recommended \
setting unless you have strict client control requirements.
permitted.client.specific.clients = Specify Client(s)
permitted.client.add.other.client = Add Other Client
permitted.client.save.settings = Save Settings
permitted.client.add = Add
permitted.client.remove = remove
permitted.client.tooltip = Specify the name of the client which is returned by the Software Version check. \
The name you specify must be<br>part of the string returned by the fetch call.
permitted.client.website=website
spark.version.title = Spark Version
spark.version.instructions = Set the specific version of the Spark IM client users can use \
with your system for each operating system. If you deploy a new version, users will be \
automatically notified to upgrade.
spark.version.form.builds = Place builds in the following directory:
spark.version.form.upload = Upload Spark Client:
spark.version.form.button = Upload Spark
spark.version.form.confirmation.build = Build information updated successfully.
spark.version.form.confirmation.upload = New spark file uploaded.
spark.version.form.clients.active = Active
spark.version.form.clients.name = Client Name
spark.version.form.clients.date = Date
spark.version.form.clients.nobuilds = No builds available.
spark.version.form.clients.windows = Windows Clients
spark.version.form.clients.mac = Mac Clients
spark.version.form.clients.nix = Linux/Unix Clients
spark.version.form.optional = Optional Message
spark.version.form.optional.instructions = Use the text area below to specify a message that \
each client will see during the download of a new build.
spark.version.form.update = Update Spark Versions
spark.download.title = Spark Download
spark.download.instructions = To download Spark directly, use the following links:
spark.download.nobuild = No build available.
spark.download.windows = Windows:
spark.download.mac = Mac OSX:
spark.download.nix = Linux/Unix:
spark.download.emailtemplate = Email Template
spark.download.emailtemplate.instructions = You can use the following text as a template for \
notifying users about where to download the Spark IM client.
spark.download.emailtemplate.template.part1 = We've deployed a new instant messaging system based \
on the Openfire server and Spark IM client that has strong security and a lot of great \
features. Getting up and running only takes a few minutes. Download the installer from:
spark.download.emailtemplate.template.part2 = Once you've performed the initial installation, \
the client will automatically notify you when updates are available.
spark.download.emailtemplate.template.part3 = When the client starts, enter your username and password along with the server name {0}.
spark.download.emailtemplate.template.part4 = Please contact me for your username and password.
sparkweb.launch.title = SparkWeb Launch
sparkweb.launch.instructions = To launch SparkWeb from an external web site, you can reference the following URL:
sparkweb.launch.launchurl = Launch URL:
archive.settings.title = Archive Settings
archive.settings.success = Archive Settings have been saved.
archive.settings.rebuild.success = Search Indexes are rebuilding.
archive.settings.message.metadata.title = Message and Metadata Settings
archive.settings.message.metadata.description = Enable or disable message and/or metadata archiving.
archive.settings.description = Use the form below to manage the archiving settings.
archive.settings.enable.metadata = Conversation State Archiving
archive.settings.enable.metadata.description = Record who talks to who, how long their conversations last, \
and the number of messages in each conversation. The actual message contents will not be recorded unless \
message archiving is enabled.
archive.settings.enable.message = Message Archiving
archive.settings.enable.message.description = Archive the full text of all messages sent between users. \
Message text will be searchable using keywords.
archive.settings.idle.time = Idle Time
archive.settings.idle.time.description = The number of minutes a conversation can be idle before it's ended.
archive.settings.max.time = Max Time
archive.settings.max.time.description = The maximum number of minutes a conversation can last before it's ended.
archive.settings.index.settings = Index Settings
archive.settings.index.settings.description = View and/or rebuild the current Search Index.
archive.settings.current.index = Current Search Index
archive.settings.current.index.description = The current size of the message index.
archive.settings.message.count = Archived Message Count
archive.settings.message.count.description = The total number of archived messages.
archive.settings.conversation.count = Archived Conversation Count
archive.settings.conversation.count.description = The total number of archived conversations.
archive.settings.update.settings = Update Settings
archive.settings.cancel = Cancel
archive.settings.rebuild = Rebuild Index
archive.settings.any = Any
archive.settings.one_to_one=Archive one-to-one chats
archive.settings.group_chats=Archive group chats
archive.settings.certain_rooms=Only archive conversations of the following room names (separated by comma)
archive.search.title = Search Archive
archive.search.participants = Participant(s):
archive.search.participants.tooltip = Enter or browse for the name of the participant to search for. \
You can also enter a second participant for more specific conversations.
archive.search.participants.any = Any
archive.search.participants.browse = Browse
archive.search.daterange = Date Range:
archive.search.daterange.tooltip = Enter specific date ranges to search between. You can specify a \
start date and/or end date.
archive.search.daterange.start = Start:
archive.search.daterange.end = End:
archive.search.daterange.any = Any
archive.search.daterange.format = Use mm/dd/yy
archive.search.daterange.error = The end time must be after the start time.
archive.search.keywords = Keywords:
archive.search.keywords.optional = (optional)
archive.search.keywords.disabled = Keyword searching is disabled. To enable keyword searching, you must \
enable message archiving in {0}Archiving Settings{1}.
archive.search.pdf.title = Conversation Transcript
archive.search.pdf.participants = Participants:
archive.search.pdf.startdate = Start Date:
archive.search.pdf.duration = Duration:
archive.search.pdf.messagecount = Message Count:
archive.search.submit = Search
archive.search.results = Search Results:
archive.search.results.description = Your search returned {0} results. Select a result on the left to view the chat conversation.
archive.search.results.xofy = of
archive.search.results.participants = Participants:
archive.search.results.messagecount = Message Count:
archive.search.results.date = Date:
archive.search.results.duration = Duration:
archive.search.results.none = No conversations were found using the specified search criteria. Please change your search criteria and try again.
archive.search.results.archive_disabled = The messages in this conversation were not archived.
archive.conversations = Active conversations:
archive.conversations.users = Users
archive.conversations.duration = Duration
archive.conversations.lastactivity = Last Activity
archive.conversations.messages = Messages
archive.converations.no_conversations = No active conversations.
stat.active_group_chats.name = Group Chat: Rooms
stat.active_group_chats.desc = The number of group chat rooms that have been active over time.
stat.active_group_chats.units = Group chat Rooms
stat.server_sessions.name = Server to Server Connections
stat.server_sessions.desc = Number of Server to Server Connections.
stat.server_sessions.units = S2S Connections
stat.sessions.name = Client Connections
stat.sessions.desc = Number of Clients Connected Directly to the Server.
stat.sessions.units = Client Connections
stat.packet_count.name = Packet Count
stat.packet_count.desc = Number of Packets Sent and Received by Enterprise Server.
stat.packet_count.units = Packets per Minute
stat.conversation.name = Conversations
stat.conversation.desc = Conversations between users.
stat.conversation.units = Conversations
# Enterprise Bookmarks
users = Users
groups = Groups
options = Options
cancel = Cancel
create = Create
group.chat.bookmark.title = Group Chat Bookmarks
group.chat.bookmark.description = Create bookmarks for group chat rooms below. Each bookmark can be assigned to particular individuals or groups (or all users).
group.chat.bookmark.created = Group chat bookmark has been created.
group.chat.bookmark.removed = Group chat bookmark removed.
group.chat.bookmark.name = Group Chat Name
group.chat.bookmark.address = Group Chat Address
group.chat.bookmark.autojoin = Auto-Join
group.chat.bookmark.users = user(s)
group.chat.bookmark.groups = group(s)
group.chat.bookmark.none = You do not currently have any group chat bookmarks. Click the 'add group chat bookmark' to add a new group chat room.
group.chat.bookmark.add = Add Group Chat Bookmark
bookmark.edit = Edit Bookmark
bookmark.create = Create Bookmark
bookmark.created = A new bookmark has been created.
bookmark.url.name = URL Name
bookmark.url.name.description = eg. Our Internal Website
bookmark.url = URL
bookmark.url.manager.title = URL Bookmark Manager
bookmark.url.manager.description = Allows creation of URL Bookmarks in a users IM client. URL Bookmarks allow \
for quick access to frequently used links, directly from their client.
bookmark.url.success = A URL Bookmark has been created.
bookmark.url.deleted = URL Bookmark deleted.
bookmark.url.users = Users
bookmark.url.groups = Groups
bookmark.url.rss = RSS
bookmark.url.options = Options
bookmark.url.no.bookmarks = You do not currently have any URL Bookmarks. Click the 'add url bookmark' to add a new url bookmark.
bookmark.url.add = Add URL Bookmark
bookmark.create.rss.feed = RSS Feed:
bookmark.create.all.users = All Users
bookmark.url.error = Please specify a url to use.
bookmark.browse.users = Browse Users
bookmark.browse.groups = Browse Groups
bookmark.users.groups.error = You must specify users and/or groups to create a valid bookmark.
bookmark.save.changes = Save Changes
bookmark.urlName.error = Please specify the name of the url.
bookmark.groupchat.name.error = Please specify the group chat name.
bookmark.groupchat.address.error = Please specify a valid address of the group chat room.
bookmark.url.create.description = Create a new URL bookmark using the form below.
bookmark.groupchat.create.description = Create a new group chat room bookmark using the form below.
bookmark.url.edit.description = Edit URL bookmark using the form below.
bookmark.groupchat.edit.description = Edit group chat room bookmark using the form below.
bookmark.delete.confirm = Delete this bookmark?
bookmark.delete.confirm.prompt = Are you sure you want to remove this bookmark?
bookmark.delete.url.urlname = URL Name:
bookmark.delete.url.url = URL:
bookmark.delete.url.users = Users:
bookmark.delete.url.groups = Groups:
bookmark.delete.url.submit = Delete
bookmark.delete.url.cancel = Cancel
bookmark.delete.chat.groupname = Group Chat Name:
bookmark.delete.chat.address = Group Chat Address:
bookmark.delete.chat.users = Users:
bookmark.delete.chat.groups = Groups:
bookmark.delete.chat.autojoin = Auto-Join:
bookmark.delete.chat.submit = Delete
bookmark.delete.chat.cancel = Cancel
# Dashboard
dashboard.title = Dashboard
dashboard.description = A snapshot of the current activity in the Enterprise Server.
dashboard.directions = Click on the graphs below to see an enlargement.
dashboard.snapshot.enlarge = Enlarge Graph
dashboard.snapshot.shrink = Shrink Graph
dashboard.timespan = Timespan:
dashboard.timespan.lasthour = 1 Hour
dashboard.timespan.last24hours = 24 Hours
dashboard.timespan.last7days = 7 Days
dashboard.spotlights.high = High:
dashboard.spotlights.low = Low:
dashboard.spotlights.packetactivity = Packets Per Minute
dashboard.spotlights.activeconversations = Active Conversations
dashboard.spotlights.currentusers = Current Users
dashboard.quickstats = Quick Stats
dashboard.quickstats.high = High
dashboard.quickstats.low = Low
dashboard.currentconversations = Current Conversations
dashboard.currentconversations.details = view details
dashboard.currentconversations.users = Users
dashboard.currentconversations.lastactivity = Last Activity
dashboard.currentconversations.messagecount = Messages
dashboard.currentconversations.none = No active conversations.
dashboard.group_conversation=Group Conversation
# All Reports
allreports.title = All Reports
allreports.daterange = Date Range
allreports.daterange.preset = Preset
allreports.daterange.preset.last60minutes = Last 60 minutes
allreports.daterange.preset.last24hours = Last 24 hours
allreports.daterange.preset.thisweek = This week
allreports.daterange.preset.last7days = Last 7 days
allreports.daterange.preset.lastweek = Last week
allreports.daterange.preset.thismonth = This month
allreports.daterange.preset.lastmonth = Last month
allreports.daterange.preset.last3months = Last 3 months
allreports.daterange.specific = Specific
allreports.daterange.specific.startdate = Start:
allreports.daterange.specific.enddate = End:
allreports.daterange.startdate.error = Please enter a start date in the format mm/dd/yy.
allreports.daterange.enddate.error = Please enter an end date before tomorrow in the format mm/dd/yy.
allreports.selectreport = Select Report
allreports.download.allreports = Download All Reports
allreports.download.allreports.pdf = PDF
allreports.download.allreports.pdf.format = PDF Format
allreports.download.singlereport = Download this report:
allreports.download.singlereport.pdf = PDF
allreports.reportinformation = Report Information
archive.group_conversation={0}Group Conversation{1}
archive.search.group_conversation=Group Chat: {0}
archive.group_conversation.close=Close
archive.group_conversation.participants=Participants
archive.group_conversation.participants.title=Group Chat Participants
archive.group_conversation.participants.description=The table below shows the users that participated in the group \
conversation that took place in the room: {0}.
archive.group_conversation.participants.participant=Users
archive.group_conversation.participants.empty=No participants were found.
muc.conversation.joined.anonymous={0} (anonymous) has joined the room
muc.conversation.left.anonymous={0} (anonymous) has left the room
muc.conversation.joined={0} ({1}) has joined the room
muc.conversation.left={0} ({1}) has left the room
\ No newline at end of file
# $RCSfile$
# $Revision: 3148 $
# $Date: 2005-12-01 14:50:45 -0300 (Thu, 01 Dec 2005) $
##
## Enterprise Resource Bundle - Czech locale (cs_CZ)
##
## For a full changelog, refer to the English bundle, enterprise_i18n.properties.
##
## Updated for release: 3.3.0
# Enterprise
login.title = Administr\u00e1torsk\u00e1 konzole
error.exception = V\u00fdjimka:
plugin.name=Openfire Enterprise
plugin.description=Openfire Enterprise Edition
admin.tab.enterprise.name=Enterprise
admin.tab.enterprise.description=Openfire Enterprise
admin.sidebar.statistics.name=Statistiky
admin.sidebar.statistics.description="Openfire Enterprise statistiky
admin.item.stats-dashboard.name=Dashboard
admin.item.stats-dashboard.description=Zobrazen\u00ed p\u0159ehledu statistik serveru.
admin.item.stats-reporter.name=V\u0161echny z\u00e1znamy
admin.item.stats-reporter.description=Zobrazen\u00ed detailn\u00edch z\u00e1znam\u016f statistik serveru.
admin.sidebar.archiving.name=Archivace
admin.sidebar.archiving.description=Nastaven\u00ed archivace Openfire Enterprise
admin.item.archive-search.name=Prohled\u00e1v\u00e1n\u00ed archivu
admin.item.archive-search.description=Klikn\u011bte pro prohled\u00e1v\u00e1n\u00ed archivu
admin.item.archive-settings.name=Nastaven\u00ed archivace
admin.item.archive-settings.description=Klikn\u011bte pro nastaven\u00ed archivace.
admin.item.active-conversations.name=Konverzace
admin.item.active-conversations.description=Klikn\u011bte pro zobrazen\u00ed aktivn\u00edch konverzac\u00ed.
admin.sidebar.client.name=Spr\u00e1va klient\u016f
admin.sidebar.client.description=Spr\u00e1va mo\u017enost\u00ed klient\u016f a nasazen\u00ed Sparku
admin.item.client-features.name=Mo\u017enosti klient\u016f
admin.item.client-features.description=Klikn\u011bte pro povolen\u00ed nebo zak\u00e1z\u00e1n\u00ed mo\u017enost\u00ed klient\u016f.
admin.item.client-version.name=Povolen\u00ed klienti
admin.item.client-version.description=Klikn\u011bte pro konfiguraci, kter\u00e9 klientsk\u00e9 aplikace se mohou p\u0159ipojit \
k va\u0161emu serveru.
admin.item.groupchat-bookmarks.name=Z\u00e1lo\u017eky skupinov\u00e9ho chatu
admin.item.groupchat-bookmarks.description=Klikn\u011bte pro spr\u00e1vu z\u00e1lo\u017eek skupinov\u00e9ho chatu pro u\u017eivatele.
admin.item.url-bookmarks.name=URL z\u00e1lo\u017eky
admin.item.url-bookmarks.description=Klikn\u011bte pro spr\u00e1vu URL z\u00e1lo\u017eek pro u\u017eivatele.
admin.item.spark-version.name=Verze Sparku
admin.item.spark-version.description=Klikn\u011bte pro nastaven\u00ed verze klienta Spark pro jednotliv\u00e9 platformy.
admin.item.spark-download.name=Sta\u017een\u00ed Sparku
admin.item.spark-download.description=St\u00e1hne Spark.
admin.sidebar.general.name=Obecn\u00e9
admin.sidebar.general.description=Obecn\u00e1 nastaven\u00ed Openfire Enterprise
admin.item.license.name=Informace o licenci
admin.item.license.description=Klikn\u011bte pro zobrazen\u00ed licen\u010dn\u00edch informac\u00ed.
license.eval.header = Dny zb\u00fdvaj\u00edc\u00ed pro ov\u011b\u0159ov\u00e1n\u00ed: {0}
license.eval.body = Va\u0161e zku\u0161ebn\u00ed verze Openfire Enterprise vypr\u0161\u00ed za {0} dn\u00ed. Kontaktujte \
na\u0161e {1}obchodn\u00ed odd\u011blen\u00ed{2} pro zakoupen\u00ed licence.
license.expiration.header = Po\u010det dn\u00ed do vypr\u0161en\u00ed licence: {0}
license.expiration.body = Va\u0161e licence Openfire Enterprise vypr\u0161\u00ed b\u011bhem {0} dn\u016f. Pros\u00edm \
kontaktujte n\u00e1\u0161 {1}prodejn\u00ed t\u00fdm{2} pro zakoupen\u00ed nov\u00e9 licence.
license.maintenance.header = Dny do vypr\u0161en\u00ed podpory: {0}
license.maintenance.body = Va\u0161e podpora pro Openfire Enterprise vypr\u0161\u00ed b\u011bhem {0} dn\u016f. Pros\u00edm \
kontaktujte n\u00e1\u0161 {1}prodejn\u00ed t\u00fdm{2} pro zakoupen\u00ed nov\u00e9 licence.
license.eval.mini.multi_day = {0} dn\u00ed
license.eval.mini.single_day = 1 den
license.shrink = Zmen\u0161it
license.expand = Rozt\u00e1hnout
license.title = Licen\u010dn\u00ed informace
license.error = Chyba licence
license.error.no_license = Nenalezena \u017e\u00e1dn\u00e1 licence
license.error.parse_error = Text licence nemohl b\u00fdt zpracov\u00e1n. Pros\u00edm vlo\u017ete celou licenci.
license.error.expired = Licence vypr\u0161ela. Pros\u00edm zadejte aktualizovanou licenci.
license.error.invalid = Soubor s licenc\u00ed je neplatn\u00fd nabo poru\u0161en\u00fd. Pros\u00edm zadejte platnou licenci.
license.error.default = Nastala chyba p\u0159i ov\u011b\u0159ov\u00e1n\u00ed licen\u010dn\u00edho souboru. Pros\u00edm zadejte platnou licenci.
license.error.not_found = <p>Nebyl nalezen licen\u010dn\u00ed soubor. Dole pros\u00edm vlo\u017ete licen\u010dn\u00ed soubor.</p>\
<p><b>Pot\u0159ebujete zku\u0161ebn\u00ed licenci?</b> Zaregistrujte se pro z\u00edsk\u00e1n\u00ed 30-ti denn\u00ed zku\u0161ebn\u00ed licence na \
<a href="http://www.jivesoftware.com/products/openfire/eval_landing.jsp" target="_blank">jivesoftware.com</a>.</p>
license.error.too_many_users = P\u0159ekro\u010dili jste maxim\u00e1ln\u00ed po\u010det u\u017eivatel\u016f, kter\u00fd povoluje va\u0161e licence. \
Odpojte u\u017eivatele nebo vlo\u017ete nov\u00fd licen\u010dn\u00ed soubor.
license.updated = Licence \u00fasp\u011b\u0161n\u011b aktualizov\u00e1na.
license.details = Detaily licence Openfire Enterprise
license.display.type = Typ licence
license.display.expires = Licence vypr\u0161\u00ed
license.display.created = Licence vytvo\u0159ena
license.display.max_users = Maximum u\u017eivatel\u016f
license.display.no_expires_date = Nikdy
license.display.no_creation_date = Nezn\u00e1mo
license.new_license.title = Zad\u00e1n\u00ed licence
license.new_license.description = Pro vlo\u017een\u00ed va\u0161eho licen\u010dn\u00edho kl\u00ed\u010de zkop\u00edrujte a vlo\u017ete obsah \
va\u0161eho souboru enterprise.license do spodn\u00edho pole.
license.update_license.update = Aktualizace licence
license.update_license.cancel = Zru\u0161it
license.update_license.title = Aktualizovat licenci
license.update_license.description = Zkop\u00edrujte a vlo\u017ete obsah va\u0161eho souboru enterprise.license \
do spodn\u00edho pole.
license.alt = Alternativn\u011b m\u016f\u017eete zkop\u00edrovat soubor enterprise.license do \
n\u00e1sleduj\u00edc\u00edho um\u00edst\u011bn\u00ed (m\u016f\u017ee vy\u017eadovat restart serveru, aby se zm\u011bna uplatnila)
license.submit = Odeslat
# Enteprise Spark Manager
client.features.title = Mo\u017enosti klient\u016f
client.feature = Mo\u017enost
client.features.spark.only = (Pouze Spark)
client.features.update.features = Povolen\u00ed mo\u017enost\u00ed klient\u016f bylo aktualizov\u00e1no.
client.features.info = Pou\u017eijte spodn\u00ed formul\u00e1\u0159 pro povolen\u00ed \u010di zak\u00e1z\u00e1n\u00ed mo\u017enost\u00ed klient\u016f. \
Pozn\u00e1mka: N\u011bkter\u00e1 omezen\u00ed klient\u016f se t\u00fdkaj\u00ed jen Spark klienta.
client.features.broadcasting = Vys\u00edl\u00e1n\u00ed
client.features.broadcasting.description = Povoluje vys\u00edl\u00e1n\u00ed zpr\u00e1v specifick\u00fdm skupin\u00e1m nebo cel\u00e9mu seznamu.
client.features.enabled = Povoleno
client.features.disabled = Zak\u00e1z\u00e1no
client.features.filetransfer = P\u0159enos soubor\u016f
client.features.filetransfer.description = Povoluje pos\u00edl\u00e1n\u00ed soubor\u016f od jednoho u\u017eivatele jin\u00e9mu.
client.features.groupchat = Skupinov\u00fd chat
client.features.groupchat.description = Povoluje p\u0159ipojen\u00ed do m\u00edstnost\u00ed skupinov\u00e9ho chatu.
client.features.vcard = Avatar/VCard
client.features.vcard.description = Povoluje u\u017eivatel\u016fm zm\u011bnit sv\u00e9 profily a avatary.
client.features.save.settings = Ulo\u017eit nastaven\u00ed
permitted.client.title = Povolen\u00ed klienti
permitted.client.description = Pou\u017eijte spodn\u00ed formul\u00e1\u0159 pro omezen\u00ed p\u0159\u00edstupu klient\u016f.
permitted.client.success = Nastaven\u00ed verz\u00ed klient\u016f bylo zm\u011bn\u011bno.
permitted.client.legend = Klienti, kte\u0159\u00ed se mohou p\u0159ipojit
permitted.client.all.clients = V\u0161ichni klienti
permitted.client.all.clients.description = Povol\u00ed p\u0159ipojen\u00ed v\u0161em XMPP klient\u016fm. Toto je doporu\u010den\u00e9 \
nastaven\u00ed, pokud nem\u00e1te po\u017eadavky na striktn\u00ed kontrolu klient\u016f.
permitted.client.specific.clients = Specifikujte klienta(-y)
permitted.client.add.other.client = P\u0159idat jin\u00e9ho klienta
permitted.client.save.settings = Ulo\u017eit nastaven\u00ed
permitted.client.add = P\u0159idat
permitted.client.remove = odebrat
permitted.client.tooltip = Zadejte jm\u00e9no klienta, kter\u00e9 vrac\u00ed kontrola verze softwaru. \
Jm\u00e9no, kter\u00e9 zad\u00e1te, mus\u00ed b\u00fdt <br>\u010d\u00e1st\u00ed \u0159et\u011bzce vr\u00e1cen\u00e9ho vol\u00e1n\u00edm z\u00edsk\u00e1n\u00ed verze.
permitted.client.website=webserver
spark.version.title = Verze Sparku
spark.version.instructions = Nastavte ur\u010ditou verzi IM klienta Spark, kterou u\u017eivatel\u00e9 mohou po\u017e\u00edvat \
s va\u0161\u00edm syst\u00e9mem pro ka\u017ed\u00fd opera\u010dn\u00ed syst\u00e9m. Pokud nasad\u00edte novou verzi, u\u017eivatel\u00e9 budou \
automaticky vyzv\u00e1ni k upgradu.
spark.version.form.builds = Um\u00edst\u011bte buildy do n\u00e1sleduj\u00edc\u00edho adres\u00e1\u0159e:
spark.version.form.upload = Upload Spark klienta:
spark.version.form.button = Upload Sparku
spark.version.form.confirmation.build = Informace o buildech \u00fasp\u011b\u0161n\u011b aktualizov\u00e1ny.
spark.version.form.confirmation.upload = Nov\u00fd spark soubor uploadov\u00e1n.
spark.version.form.clients.active = Aktivn\u00ed
spark.version.form.clients.name = Jm\u00e9no klienta
spark.version.form.clients.date = Datum
spark.version.form.clients.nobuilds = \u017d\u00e1dn\u00e9 buildy k dispozici.
spark.version.form.clients.windows = Klienti Windows
spark.version.form.clients.mac = Mac klienti
spark.version.form.clients.nix = Klienti Linux/Unix
spark.version.form.optional = Voliteln\u00e1 zpr\u00e1va
spark.version.form.optional.instructions = Pou\u017eijte spodn\u00ed textovou oblast pro zad\u00e1n\u00ed zpr\u00e1vy, kterou \
uvid\u00ed ka\u017ed\u00fd klient b\u011bhem stahov\u00e1n\u00ed nov\u00e9ho buildu.
spark.version.form.update = Aktualizujte verze Sparku
spark.download.title = Sta\u017een\u00ed Sparku
spark.download.instructions = Pro p\u0159\u00edm\u00e9 sta\u017een\u00ed Sparku pou\u017eijte n\u00e1sleduj\u00edc\u00ed odkazy:
spark.download.nobuild = \u017d\u00e1dn\u00e9 dostupn\u00e9 buildy.
spark.download.windows = Windows:
spark.download.mac = Mac OSX:
spark.download.nix = Linux/Unix:
spark.download.emailtemplate = \u0160ablona emailu
spark.download.emailtemplate.instructions = N\u00e1sleduj\u00edc\u00ed text m\u016f\u017eete pou\u017e\u00edt jako \u0161ablonu pro \
upozorn\u011bn\u00ed u\u017eivatel\u016fm o tom, odkud st\u00e1hnout IM klienta Spark.
spark.download.emailtemplate.template.part1 = Nasadili jsme nov\u00fd syst\u00e9m instant messagingu zalo\u017een\u00fd na \
serveru Openfire a IM klientech Spark, kter\u00fd m\u00e1 siln\u00e9 zabezpe\u010den\u00ed a mnoho skv\u011bl\u00fdch \
mo\u017enost\u00ed. Nasazen\u00ed a rozb\u011bhnut\u00ed zabere pouze n\u011bkolik minut. St\u00e1hn\u011bte si instal\u00e1tor z:
spark.download.emailtemplate.template.part2 = Jakmile provedete prvotn\u00ed instalaci, \
bude v\u00e1s klient automaticky upozor\u0148ovat, kdy\u017e budou k dispozici aktualizace.
spark.download.emailtemplate.template.part3 = P\u0159i startu klienta zadejte va\u0161e u\u017eivatelsk\u00e9 jm\u00e9no a heslo spolu se jm\u00e9nem serveru {0}.
spark.download.emailtemplate.template.part4 = Pros\u00edm kontaktujte m\u011b pro z\u00edsk\u00e1n\u00ed va\u0161eho u\u017eivatelsk\u00e9ho jm\u00e9na a hesla.
archive.settings.title = Nastaven\u00ed archivace
archive.settings.success = Nastaven\u00ed archivace bylo ulo\u017eeno.
archive.settings.rebuild.success = Vyhled\u00e1vac\u00ed indexy jsou obnovov\u00e1ny.
archive.settings.message.metadata.title = Nastaven\u00ed zpr\u00e1v a metadat
archive.settings.message.metadata.description = Povol\u00ed nebo zak\u00e1\u017ee archivaci zpr\u00e1v a/nebo metadat.
archive.settings.description = Pou\u017eijte spodn\u00ed formul\u00e1\u0159 pro spr\u00e1vu nastaven\u00ed archivace.
archive.settings.enable.metadata = Archivace stavu konverzace
archive.settings.enable.metadata.description = Zaznamen\u00e1v\u00e1 kdo s k\u00fdm mluv\u00ed, jak dlouho trv\u00e1 jejich konverzace, \
a po\u010det zpr\u00e1v v ka\u017ed\u00e9 konverzaci. Skute\u010dn\u00fd obsah zpr\u00e1v nebude zaznamen\u00e1v\u00e1n pokud nebude \
povolena archivace zpr\u00e1v.
archive.settings.enable.message = Archivace zpr\u00e1v
archive.settings.enable.message.description = Archivuje cel\u00fd text v\u0161ech zpr\u00e1v zaslan\u00fdch mezi u\u017eivateli. \
Text zpr\u00e1v bude mo\u017en\u00e9 prohled\u00e1vat za pomoci kl\u00ed\u010dov\u00fdch slov.
archive.settings.idle.time = Doba ne\u010dinnosti
archive.settings.idle.time.description = Po\u010det minut b\u011bhem kter\u00fdch m\u016f\u017ee b\u00fdt konverzace ne\u010dinn\u00e1 ne\u017e bude ukon\u010dena.
archive.settings.max.time = Maxim\u00e1ln\u00ed \u010das
archive.settings.max.time.description = Maxim\u00e1ln\u00ed po\u010det minut trv\u00e1n\u00ed konverzace ne\u017e bude ukon\u010dena.
archive.settings.index.settings = Nastaven\u00ed index\u016f
archive.settings.index.settings.description = Prohl\u00ed\u017een\u00ed a/nebo obnova aktu\u00e1ln\u00edho vyhled\u00e1vac\u00edho indexu.
archive.settings.current.index = Aktu\u00e1ln\u00ed vyhled\u00e1vac\u00ed index
archive.settings.current.index.description = Aktu\u00e1ln\u00ed velikost indexu zpr\u00e1v.
archive.settings.message.count = Po\u010det archivovan\u00fdch zpr\u00e1v
archive.settings.message.count.description = Celkov\u00fd po\u010det archivovan\u00fdch zpr\u00e1v.
archive.settings.conversation.count = Po\u010det archivovan\u00fdch konverzac\u00ed
archive.settings.conversation.count.description = Celkov\u00fd po\u010det archivovan\u00fdch konverzac\u00ed.
archive.settings.update.settings = Aktualizovat nastaven\u00ed
archive.settings.cancel = Zru\u0161it
archive.settings.rebuild = Obnovit index
archive.settings.any = Jak\u00fdkoli
archive.settings.one_to_one=Archivovat chaty jeden na jednoho
archive.settings.group_chats=Archivovat skupinov\u00e9 chaty
archive.settings.certain_rooms=Archivovat pouze konverzace n\u00e1sleduj\u00edc\u00edch jmen m\u00edstnost\u00ed (odd\u011blen\u00e9 \u010d\u00e1rkou)
archive.search.title = Prohled\u00e1v\u00e1n\u00ed archivu
archive.search.participants = \u00da\u010dastn\u00edk(-ci):
archive.search.participants.tooltip = Zadejte nebo vyberte jm\u00e9ho hledan\u00e9ho \u00fa\u010dastn\u00edka. \
M\u016f\u017eete tak\u00e9 zadat druh\u00e9ho \u00fa\u010dastn\u00edka pro z\u00edsk\u00e1n\u00ed konkr\u00e9tn\u011bj\u0161\u00ed konverzace.
archive.search.participants.any = Kdokoli
archive.search.participants.browse = Proch\u00e1zet
archive.search.daterange = Rozsah datum\u016f:
archive.search.daterange.tooltip = Zadejte specifick\u00fd rozsah datum\u016f, mezi kter\u00fdmi hledat. M\u016f\u017eete zadat \
po\u010d\u00e1te\u010dn\u00ed a/nebo koncov\u00e9 datum.
archive.search.daterange.start = Za\u010d\u00e1tek:
archive.search.daterange.end = Konec:
archive.search.daterange.any = Kdykoli
archive.search.daterange.format = Pou\u017eijte mm/dd/yy
archive.search.daterange.error = Koncov\u00e9 datum mus\u00ed b\u00fdt po po\u010d\u00e1te\u010dn\u00edm \u010dase.
archive.search.keywords = Kl\u00ed\u010dov\u00e1 slova:
archive.search.keywords.optional = (voliteln\u011b)
archive.search.keywords.disabled = Hled\u00e1n\u00ed kl\u00ed\u010dov\u00fdch slov je zak\u00e1z\u00e1no. Pro povolen\u00ed vyhled\u00e1v\u00e1n\u00ed kl\u00ed\u010dov\u00fdch slov mus\u00edte \
povolit archivaci zpr\u00e1v v {0}Nastaven\u00ed archivace{1}.
archive.search.pdf.title = P\u0159epis konverzace
archive.search.pdf.participants = \u00da\u010dastn\u00edci:
archive.search.pdf.startdate = Datum za\u010d\u00e1tku:
archive.search.pdf.duration = Trv\u00e1n\u00ed:
archive.search.pdf.messagecount = Po\u010det zpr\u00e1v:
archive.search.submit = Hled\u00e1n\u00ed
archive.search.results = V\u00fdsledky hled\u00e1n\u00ed:
archive.search.results.description = Va\u0161e hled\u00e1n\u00ed vr\u00e1tilo {0} v\u00fdsledk\u016f. Vyberte vlevo v\u00fdsledek pro zobrazen\u00ed konverzace chatu.
archive.search.results.xofy = z
archive.search.results.participants = \u00da\u010dastn\u00edci:
archive.search.results.messagecount = Po\u010det zpr\u00e1v:
archive.search.results.date = Datum:
archive.search.results.duration = Trv\u00e1n\u00ed:
archive.search.results.none = Nebyly nalezeny \u017e\u00e1dn\u00e9 konverzace za pou\u017eit\u00ed zadan\u00fdch v\u00fdb\u011brov\u00fdch podm\u00ednek. Pros\u00edm zm\u011b\u0148te va\u0161e vyhled\u00e1vac\u00ed podm\u00ednky a zkuste to znovu.
archive.search.results.archive_disabled = Zpr\u00e1vy v t\u00e9to konverzaci nebyly archivov\u00e1ny.
archive.conversations = Aktivn\u00ed konverzace:
archive.conversations.users = U\u017eivatel\u00e9
archive.conversations.duration = Trv\u00e1n\u00ed
archive.conversations.lastactivity = Posledn\u00ed aktivita
archive.conversations.messages = Zpr\u00e1vy
archive.converations.no_conversations = \u017d\u00e1dn\u00e9 aktivn\u00ed konverzace.
stat.active_group_chats.name = Skupinov\u00fd chat: M\u00edstnosti
stat.active_group_chats.desc = Po\u010det m\u00edstnost\u00ed skupinov\u00e9ho chatu, kter\u00e9 byly v posledn\u00ed dob\u011b aktivn\u00ed.
stat.active_group_chats.units = M\u00edstnost\u00ed skupinov\u00e9ho chatu
stat.server_sessions.name = Meziserverov\u00e9 relace
stat.server_sessions.desc = Po\u010det spojen\u00ed server-server.
stat.server_sessions.units = Spojen\u00ed S2S
stat.sessions.name = Klientsk\u00e9 relace
stat.sessions.desc = Po\u010det klient\u016f p\u0159\u00edmo p\u0159ipojen\u00fdch k serveru.
stat.sessions.units = Klientsk\u00e9 relace
stat.packet_count.name = Po\u010det paket\u016f
stat.packet_count.desc = Po\u010det paket\u016f p\u0159ijat\u00fdch a odeslan\u00fdch serverem Openfire.
stat.packet_count.units = Pakety za minutu
stat.conversation.name = Konverzace
stat.conversation.desc = Konverzace mezi u\u017eivateli.
stat.conversation.units = Konverzace
# Enterprise Bookmarks
users = U\u017eivatel\u00e9
groups = Skupiny
options = Volby
cancel = Zru\u0161it
create = Vytvo\u0159it
group.chat.bookmark.title = Z\u00e1lo\u017eky skupinov\u00e9ho chatu
group.chat.bookmark.description = Vytvo\u0159it z\u00e1lo\u017eky pro n\u00ed\u017ee uveden\u00e9 m\u00edstnosti skupinov\u00e9ho chatu. Ka\u017ed\u00e1 z\u00e1lo\u017eka m\u016f\u017ee b\u00fdt p\u0159i\u0159azena jednotliv\u00fdm osob\u00e1m nebo skupin\u00e1m (nebo v\u0161em u\u017eivatel\u016fm).
group.chat.bookmark.created = Z\u00e1lo\u017eka skupinov\u00e9ho chatu byla vytvo\u0159ena.
group.chat.bookmark.removed = Z\u00e1lo\u017eka skupinov\u00e9ho chatu odstran\u011bna.
group.chat.bookmark.name = Jm\u00e9no skupinov\u00e9ho chatu
group.chat.bookmark.address = Adresa skupinov\u00e9ho chatu
group.chat.bookmark.autojoin = Auto-p\u0159ihl\u00e1\u0161en\u00ed
group.chat.bookmark.users = u\u017eivatel(\u00e9)
group.chat.bookmark.groups = skupina(-y)
group.chat.bookmark.none = Nam\u00e1te zat\u00edm \u017e\u00e1dn\u00e9 z\u00e1lo\u017eky skupinov\u00e9ho chatu. Klikn\u011bte na 'p\u0159idat z\u00e1lo\u017eku skupinov\u00e9ho chatu' pro p\u0159id\u00e1n\u00ed nov\u00e9 m\u00edstnosti skupinov\u00e9ho chatu.
group.chat.bookmark.add = P\u0159idat z\u00e1lo\u017eku skupinov\u00e9ho chatu
bookmark.edit = Upravit z\u00e1lo\u017eku
bookmark.create = Vytvo\u0159it z\u00e1lo\u017eku
bookmark.created = Byla vytvo\u0159ena nov\u00e1 z\u00e1lo\u017eka.
bookmark.url.name = N\u00e1zev URL
bookmark.url.name.description = nap\u0159. N\u00e1\u0161 Intern\u00ed Web
bookmark.url = URL
bookmark.url.manager.title = Spr\u00e1vce URL z\u00e1lo\u017eek
bookmark.url.manager.description = Povoluje vytv\u00e1\u0159en\u00ed URL z\u00e1lo\u017eek v IM klientech u\u017eivatel\u016f. URL z\u00e1lo\u017eky dovoluj\u00ed \
rychl\u00fd p\u0159\u00edstup k \u010dasto pou\u017e\u00edvan\u00fdm odkaz\u016fm, p\u0159\u00edmo z jejich klient\u016f.
bookmark.url.success = URL z\u00e1lo\u017eka byla vytvo\u0159ena.
bookmark.url.deleted = URL z\u00e1lo\u017eka smaz\u00e1na.
bookmark.url.users = U\u017eivatel\u00e9
bookmark.url.groups = Skupiny
bookmark.url.rss = RSS
bookmark.url.options = Volby
bookmark.url.no.bookmarks = Nam\u00e1te zat\u00edm \u017e\u00e1dn\u00e9 URL z\u00e1lo\u017eky. Klikn\u011bte na 'p\u0159idat URL z\u00e1lo\u017eku' pro p\u0159id\u00e1n\u00ed nov\u00e9 URL z\u00e1lo\u017eky.
bookmark.url.add = P\u0159idat URL z\u00e1lo\u017eku
bookmark.create.rss.feed = RSS zdroj:
bookmark.create.all.users = V\u0161ichni u\u017eivatel\u00e9
bookmark.url.error = Pros\u00edm zadejte url, kter\u00e1 se m\u00e1 pou\u017e\u00edt.
bookmark.browse.users = Proch\u00e1zet u\u017eivatele
bookmark.browse.groups = Proch\u00e1zet skupiny
bookmark.users.groups.error = Mus\u00edte zadat u\u017eivatele a/nebo skupiny pro vytvo\u0159en\u00ed platn\u00e9 z\u00e1lo\u017eky.
bookmark.save.changes = Ulo\u017eit zm\u011bny
bookmark.urlName.error = Pros\u00edm zadejte n\u00e1zev url.
bookmark.groupchat.name.error = Pros\u00edm zadejte jm\u00e9no skupinov\u00e9ho chatu.
bookmark.groupchat.address.error = Pros\u00edm zadejte platnou adresu m\u00edstnosti skupinov\u00e9ho chatu.
bookmark.url.create.description = Vytvo\u0159te novou URL z\u00e1lo\u017eku pou\u017eit\u00edm spodn\u00edho formul\u00e1\u0159e.
bookmark.groupchat.create.description = Vytvo\u0159te novou z\u00e1lo\u017eku m\u00edstnosti skupinov\u00e9ho chatu pou\u017eit\u00edm spodn\u00edho formul\u00e1\u0159e.
bookmark.url.edit.description = Upravte URL z\u00e1lo\u017eku pou\u017eit\u00edm spodn\u00edho formul\u00e1\u0159e.
bookmark.groupchat.edit.description = Upravte z\u00e1lo\u017eku m\u00edstnosti skupinov\u00e9ho chatu pou\u017eit\u00edm spodn\u00edho formul\u00e1\u0159e.
bookmark.delete.confirm = Smazat tuto z\u00e1lo\u017eku?
bookmark.delete.confirm.prompt = Jste si jisti, \u017ee chcete odstranit tuto z\u00e1lo\u017eku?
bookmark.delete.url.urlname = N\u00e1zev URL:
bookmark.delete.url.url = URL:
bookmark.delete.url.users = U\u017eivatel\u00e9:
bookmark.delete.url.groups = Skupiny:
bookmark.delete.url.submit = Smazat
bookmark.delete.url.cancel = Zru\u0161it
bookmark.delete.chat.groupname = N\u00e1zev skupinov\u00e9ho chatu:
bookmark.delete.chat.address = Adresa skupinov\u00e9ho chatu:
bookmark.delete.chat.users = U\u017eivatel\u00e9:
bookmark.delete.chat.groups = Skupiny:
bookmark.delete.chat.autojoin = Auto-p\u0159ihl\u00e1\u0161en\u00ed:
bookmark.delete.chat.submit = Smazat
bookmark.delete.chat.cancel = Zru\u0161it
# Dashboard
dashboard.title = Openfire Dashboard
dashboard.description = Zobrazen\u00ed sou\u010dasn\u00e9 aktivity ve Openfire.
dashboard.directions = Klikn\u011bte na spodn\u00ed grafy pro zobrazen\u00ed zv\u011bt\u0161eniny.
dashboard.snapshot.enlarge = Zv\u011bt\u0161it graf
dashboard.snapshot.shrink = Zmen\u0161it graf
dashboard.timespan = \u010casov\u00e9 rozp\u011bt\u00ed:
dashboard.timespan.lasthour = 1 hodina
dashboard.timespan.last24hours = 24 hodin
dashboard.timespan.last7days = 7 dn\u00ed
dashboard.spotlights.high = Vysok\u00e9:
dashboard.spotlights.low = N\u00edzk\u00e9:
dashboard.spotlights.packetactivity = Paket\u016f za minutu
dashboard.spotlights.activeconversations = Aktivn\u00ed konverzace
dashboard.spotlights.currentusers = Sou\u010dasn\u00ed u\u017eivatel\u00e9
dashboard.quickstats = Rychl\u00e9 statistiky
dashboard.quickstats.high = Vysok\u00e9
dashboard.quickstats.low = N\u00edzk\u00e9
dashboard.currentconversations = Sou\u010dasn\u00e9 konverzace
dashboard.currentconversations.details = zobrazit detaily
dashboard.currentconversations.users = U\u017eivatel\u00e9
dashboard.currentconversations.lastactivity = Posledn\u00ed aktivita
dashboard.currentconversations.messagecount = Zpr\u00e1vy
dashboard.currentconversations.none = \u017d\u00e1dn\u00e9 aktivn\u00ed konverzace.
# All Reports
allreports.title = V\u0161echny zpr\u00e1vy
allreports.daterange = Rozsah datum\u016f
allreports.daterange.preset = P\u0159ednastaveno
allreports.daterange.preset.last60minutes = Posledn\u00edch 60 minut
allreports.daterange.preset.last24hours = Posledn\u00edch 24 hodin
allreports.daterange.preset.thisweek = Tento t\u00fdden
allreports.daterange.preset.last7days = Posledn\u00edch 7 dn\u00ed
allreports.daterange.preset.lastweek = Posledn\u00ed t\u00fdden
allreports.daterange.preset.thismonth = Tento m\u011bs\u00edc
allreports.daterange.preset.lastmonth = Posledn\u00edch m\u011bs\u00edc
allreports.daterange.preset.last3months = Posledn\u00ed 3 m\u011bs\u00edce
allreports.daterange.specific = Specifick\u00e9
allreports.daterange.specific.startdate = Po\u010d\u00e1tek:
allreports.daterange.specific.enddate = konec:
allreports.daterange.startdate.error = Pros\u00edm zadejte po\u010d\u00e1te\u010dn\u00ed datum ve form\u00e1tu mm/dd/yy.
allreports.daterange.enddate.error = Pros\u00edm zadejte datum p\u0159ed z\u00edt\u0159kem ve form\u00e1tu mm/dd/yy.
allreports.selectreport = Vybrat zpr\u00e1vy
allreports.download.allreports = St\u00e1hnout v\u0161echny zpr\u00e1vy
allreports.download.allreports.pdf = PDF
allreports.download.allreports.pdf.format = Form\u00e1t PDF
allreports.download.singlereport = St\u00e1hnout tuto zpr\u00e1vu:
allreports.download.singlereport.pdf = PDF
allreports.reportinformation = Informace o zpr\u00e1v\u011b
# $RCSfile$
# $Revision: $
# $Date: $
##
## Enterprise Resource Bundle - Spanish locale (es)
##
## For a full changelog, refer to the English bundle, enterprise_i18n.properties.
##
## Updated for release: 3.2.0
# Enterprise
login.title = Consola de Administraci\u00f3n
error.exception = Excepci\u00f3n:
plugin.name=Openfire Corporativo
plugin.description=Edici\u00f3n Corporativa de Openfire.
admin.tab.enterprise.name=Corporativo
admin.tab.enterprise.description=Openfire Corporativo
admin.sidebar.statistics.name=Estad\u00edsticas
admin.sidebar.statistics.description=Estad\u00edsticas de Openfire Corporativo
admin.item.stats-dashboard.name=Consola
admin.item.stats-dashboard.description=Ver vistazo general de estad\u00edsticas del servidor.
admin.item.stats-reporter.name=Todos los Reportes
admin.item.stats-reporter.description=Ver reportes detallados de estad\u00edsticas del servidor.
admin.sidebar.archiving.name=Almacenamiento
admin.sidebar.archiving.description=Seteos de Almacenamiento de Openfire Corporativo
admin.item.archive-search.name=Buscar en Almacenamiento
admin.item.archive-search.description=Haga clic para buscar en almacenamiento.
admin.item.archive-settings.name=Seteos de Almacenamiento
admin.item.archive-settings.description=Haga clic para configurar almacenamiento.
admin.item.active-conversations.name=Conversaciones
admin.item.active-conversations.description=Haga clic para ver conversaciones activas.
admin.sidebar.client.name=Administraci\u00f3n de Clientes
admin.sidebar.client.description=Administre prestaciones de Clientes e implementaciones de Spark
admin.item.client-features.name=Prestaciones de Clientes
admin.item.client-features.description=Haga clic para habilitar y dehabilitar prestaciones de clientes.
admin.item.client-version.name=Clientes Permitidos
admin.item.client-version.description=Haga clic para configurar clientes habilitados a conectarse a \
su servidor.
admin.item.groupchat-bookmarks.name=Salas de Conferencias Favoritas
admin.item.groupchat-bookmarks.description=Haga clic para administrar salas de conferencias favoritas para los usuarios.
admin.item.url-bookmarks.name=URL Favoritos
admin.item.url-bookmarks.description=Haga clic para administrar URL favoritos para los usuarios.
admin.item.spark-version.name=Versi\u00f3n de Spark
admin.item.spark-version.description=Haga clic para setear la versi\u00f3n del cliente Spark para cada plataforma.
admin.item.spark-download.name=Descargar Spark
admin.item.spark-download.description=Descargar Spark.
admin.sidebar.general.name=General
admin.sidebar.general.description=Seteos Generales de Openfire Corporativo
admin.item.license.name=Informaci\u00f3n de Licencia
admin.item.license.description=Haga clic para ver informaci\u00f3n sobre la licencia.
license.eval.header = D\u00edas Restantes de Evaluaci\u00f3n: {0}
license.eval.body = Su per\u00edodo de evaluaci\u00f3n de Openfire Corporativo expira en {0} d\u00eda(s). Contacte \
nuestro {1}departamento de ventas{2} para comprar una licencia.
license.expiration.header = D\u00edas para que expire la Licencia: {0}
license.expiration.body = Su licencia de Openfire Corporativo va a expirar en {0} d\u00eda(s). Contacte \
nuestro {1}equipo de ventas{2} para comprar una nueva licencia.
license.maintenance.header = D\u00edas para que expire mantenimiento: {0}
license.maintenance.body = Mantenimiento de Openfire Corporativo va a expirar en {0} d\u00eda(s). Contacte \
nuestro {1}equipo de ventas{2} para comprar una nueva licencia.
license.eval.mini.multi_day = {0} d\u00edas
license.eval.mini.single_day = 1 d\u00eda
license.shrink = Encoger
license.expand = Expandir
license.title = Informaci\u00f3n de Licencia
license.error = Error de Licencia
license.error.no_license = Licencia No Encontrada
license.error.parse_error = El texto de la licencia no puse ser parseado. Ingrese el texto completo de la licencia.
license.error.expired = La licencia ha expirado. Ingrese una nueva licencia.
license.error.invalid = El archivo con la licencia es inv\u00e1lido o est\u00e1 corrupto. Ingrese una licencia v\u00e1lida.
license.error.default = Ha ocurrido un error validando la licencia. Ingrese una licencia v\u00e1lida.
license.error.not_found = No se ha encontrado el archivo con la licencia. Ingrese un archivo con licencia a continuaci\u00f3n. Si no \
tiene a\u00fan una licencia, puede registrarse para obtener un licencia de evaluaci\u00f3n por 30 d\u00edas en \
<a href="http://www.jivesoftware.com/products/openfire/eval_landing.jsp" target="_blank">jivesoftware.com</a>
license.error.too_many_users = Ha superado el n\u00famero m\u00e1ximo de usuarios permitidos por su licencia. \
Desconecte usuarios o ingrese una nueva licencia.
license.updated = Licencia actualizada exitosamente.
license.details = Detalle de la Licencia de Openfire Corporativo
license.display.type = Tipo de Licencia
license.display.expires = Licencia Expira
license.display.created = Licencia Creada
license.display.max_users = M\u00e1ximo de Usuarios
license.display.no_expires_date = Nunca
license.display.no_creation_date = Desconocido
license.new_license.title = Ingrese Licencia
license.new_license.description = Puede modificar su licencia copiando y pegando la \
licencia a continuaci\u00f3n.
license.update_license.update = Actualizar Licencia
license.update_license.cancel = Cancelar
license.update_license.title = Actualizar Licencia
license.update_license.description = Copiar y pegar el contenido de su archivo enterprise.license \
en el siguiente campo.
license.alt = Alternativamente, puede copiar el archivo enterprise.license a la \
siguiente ubicaci\u00f3n (puede requerir reiniciar el servidor para entrar en vigencia)
license.submit = Enviar
# Enteprise Spark Manager
client.features.title = Prestaciones de Clientes
client.feature = Prestaci\u00f3n
client.features.spark.only = (s\u00f3lo Spark)
client.features.update.features = Permisos de prestaciones de clientes han sido actualizados.
client.features.info = Utilice el siguiente formulario para habilitar o deshabilitar prestaciones de clientes. \
Nota: Algunas de las restricciones de clientes s\u00f3lo aplican al cliente Spark.
client.features.broadcasting = Difusi\u00f3n
client.features.broadcasting.description = Permitir difundir mensajes a grupos espec\u00edficos o lista de contactos.
client.features.enabled = Habilitado
client.features.disabled = Deshabilitado
client.features.filetransfer = Transferencia de Archivos
client.features.filetransfer.description = Permitir enviar archivos de un cliente a otro.
client.features.groupchat = Salas de Conferencias
client.features.groupchat.description = Permitir ingresar a salas de conferencias.
client.features.vcard = Avatar/Tarjeta Profesional Electr\u00f3nica
client.features.vcard.description = Permitir a los usuarios modificar sus tarjetas y avatars.
client.features.save.settings = Salvar Seteos
permitted.client.title = Clientes Permitidos
permitted.client.description = Utilice el siguiente formulario para restringir acceso de clientes.
permitted.client.success = Seteos de versiones de clientes han sido actualizados.
permitted.client.legend = Clientes Permitidos a Conectarse
permitted.client.all.clients = Todos los Clientes
permitted.client.all.clients.description = Todos los clientes XMPP pueden conectarse. Este es el seteo recomendado \
a menos que tenga requerimientos de control de clientes estrictos.
permitted.client.specific.clients = Especifique Cliente(s)
permitted.client.add.other.client = Agregar Otro Cliente
permitted.client.save.settings = Salvar Seteos
permitted.client.add = Agregar
permitted.client.remove = Borrar
permitted.client.tooltip = Especificar el nombre del cliente que es retornado cuando se verifica la Versi\u00f3n \
del Software. El nombre que especifique debe ser <br>parte del valor retornado por la verificaci\u00f3n.
permitted.client.website=website
spark.version.title = Versi\u00f3n de Spark
spark.version.instructions = Inidique la versi\u00f3n del cliente Spark IM ha ser utilizada \
en cada sistema operativo. Los usuarios ser\u00e1n autom\u00e1ticamente notificados en cuanto salga \
una nueva versi\u00f3n.
spark.version.form.builds = Coloque compilaciones en el siguiente directorio:
spark.version.form.upload = Subir Cliente Spark:
spark.version.form.button = Subir Spark
spark.version.form.confirmation.build = Informaci\u00f3n de compilaci\u00f3n actualizada exitosamente.
spark.version.form.confirmation.upload = Nueva versi\u00f3n de Spark subida.
spark.version.form.clients.active = Activo
spark.version.form.clients.name = Nombre del Cliente
spark.version.form.clients.date = Fecha
spark.version.form.clients.nobuilds = No se han encontrado compilaciones disponibles.
spark.version.form.clients.windows = Clientes de Windows
spark.version.form.clients.mac = Clientes de Mac
spark.version.form.clients.nix = Clientes de Linux/Unix
spark.version.form.optional = Mensaje Opcional
spark.version.form.optional.instructions = A continuaci\u00f3n especifique el mensaje que \
cada cliente ver\u00e1 mientras descarga una nueva versi\u00f3n.
spark.version.form.update = Actualizar Versiones de Spark
spark.download.title = Descargar Spark
spark.download.instructions = Para descargar directamente el cliente Spark utilice los siguientes enlaces:
spark.download.nobuild = No se han encontrado compilaciones disponibles.
spark.download.windows = Windows:
spark.download.mac = Mac OSX:
spark.download.nix = Linux/Unix:
spark.download.emailtemplate = Plantilla de Email
spark.download.emailtemplate.instructions = Puede usar el siguiente texto como una plantilla para \
notificar usuarios sobre el lugar para descargar el cliente Spark.
spark.download.emailtemplate.template.part1 = Hemos instalado un nuevo sistema de mensajer\u00eda instant\u00e1nea basado \
en el servidor Openfire y el cliente Spark que posee una fuerte seguridad y varias caracter\u00edsticas muy \
importantes. Instalar y utilizarlos es cuestion de minutos. Descargue el instalador de:
spark.download.emailtemplate.template.part2 = Una vez que ha concluido la instalaci\u00f3n inicial, \
el cliente le notificar\u00e1 autom\u00e1ticamente cuando haya nuevas actualizaciones.
spark.download.emailtemplate.template.part3 = Cuando el cliente arranque ingrese su nombre de usuario y clave junto con el nombre del servidor {0}.
spark.download.emailtemplate.template.part4 = Contacteme para su nombre de usuario y clave.
archive.settings.title = Seteos de Almacenamiento
archive.settings.success = Seteos de Almacenamiento han sido salvados.
archive.settings.rebuild.success = Indices de b\u00fasqueda estan siendo recontruidos.
archive.settings.message.metadata.title = Seteos de Mensajes y Metadatos
archive.settings.message.metadata.description = Habilita o deshabilita almacenamiento de mensajes y/o metadatos.
archive.settings.description = Utilice el siguiente formulario para administrar los seteos de almacenamiento.
archive.settings.enable.metadata = Almacenamiento de Estados de Conversaciones
archive.settings.enable.metadata.description = Registra qui\u00e9n charla con qui\u00e9n, cu\u00e1nto dura la conversaci\u00f3n, \
y el n\u00famero de mensajes en cada conversaci\u00f3n. El contenido de los mensajes no ser\u00e1 guardado a menos que \
almacenamiento de mensajes sea habilitado.
archive.settings.enable.message = Almacenamiento de Mensajes
archive.settings.enable.message.description = Almacenar el texto completo de todos los mensajes enviados entre usuarios. \
Se podr\u00e1 buscar en los textos de los mensajes utilizando palabras claves.
archive.settings.idle.time = Tiempo Ocioso
archive.settings.idle.time.description = El n\u00famero de minutos una conversaci\u00f3n puede estar libre antes de ser finalizada.
archive.settings.max.time = Tiempo M\u00e1ximo
archive.settings.max.time.description = El m\u00e1ximo n\u00famero de minutos una conversacion puede durar antes de ser finalizada.
archive.settings.index.settings = Seteos de Indices
archive.settings.index.settings.description = Ver y/o reconstruir el \u00edndice de b\u00fasqueda actual.
archive.settings.current.index = Indice de B\u00fasqueda Actual
archive.settings.current.index.description = El tama\u00f1o actual del \u00edndice de mensajes.
archive.settings.message.count = Contador de Almacenamiento de Mensajes
archive.settings.message.count.description = El n\u00famero total de mensajes almacenados.
archive.settings.conversation.count = Contador de Almacenamiento de Conversaciones
archive.settings.conversation.count.description = El n\u00famero total de conversaciones almacenadas.
archive.settings.update.settings = Seteos de Actualizaci\u00f3n
archive.settings.cancel = Cancelar
archive.settings.rebuild = Reconstruir Indice
archive.settings.any = Cualquiera
archive.search.title = B\u00fasqueda en Almacenamiento
archive.search.participants = Participante(s):
archive.search.participants.tooltip = Ingrese o consulte el nombre de los participantes a buscar. \
Puede tambi\u00e9n ingresar un segundo participante para conversaciones m\u00e1s espec\u00edficas.
archive.search.participants.any = Cualquiera
archive.search.participants.browse = Consultar
archive.search.daterange = Rango de Fechas:
archive.search.daterange.tooltip = Ingrese un rango de fechas espec\u00edfico para buscar. Puede \
especificar una fecha de inicio y/o fecha de fin.
archive.search.daterange.start = Inicio:
archive.search.daterange.end = Fin:
archive.search.daterange.any = Cualquiera
archive.search.daterange.format = Formato mm/dd/yy
archive.search.daterange.error = La fecha de fin debe ser posterior a la de inicio.
archive.search.keywords = Palabras claves:
archive.search.keywords.optional = (opcional)
archive.search.keywords.disabled = B\u00fasqueda por palabras claves esta deshabilitado. Para habilitarla debe \
habilitar almacenamiento de mensajes en {0}Seteos de Almacenamiento{1}.
archive.search.pdf.title = Transcripci\u00f3n de Conversaci\u00f3n
archive.search.pdf.participants = Participantes:
archive.search.pdf.startdate = Fecha de inicio:
archive.search.pdf.duration = Duraci\u00f3n:
archive.search.pdf.messagecount = Cantidad de Mensajes:
archive.search.submit = Buscar
archive.search.results = Resultados de B\u00fasqueda:
archive.search.results.description = Su b\u00fasqueda retorn\u00f3 {0} resultados. Seleccione el resultado en la izquierda para visualizar la conversaci\u00f3n.
archive.search.results.xofy = de
archive.search.results.participants = Participantes:
archive.search.results.messagecount = Cantidad de Mensajes:
archive.search.results.date = Fecha:
archive.search.results.duration = Duraci\u00f3n:
archive.search.results.none = No se han encontrado conversaciones de acuerdo al criterio de b\u00fasqueda. Modifique su criterio de b\u00fasqueda e intente nuevamente.
archive.search.results.archive_disabled = Los mensajes en esta conversaci\u00f3n no fueron almacenados.
archive.conversations = Conversaciones Activas:
archive.conversations.users = Usuarios
archive.conversations.duration = Duraci\u00f3n
archive.conversations.lastactivity = \u00daltima Actividad
archive.conversations.messages = Mensajes
archive.converations.no_conversations = No hay conversaciones activas.
stat.active_group_chats.name = Conferencias: Salas
stat.active_group_chats.desc = N\u00famero de salas de conferencias que han estado activas en el tiempo.
stat.active_group_chats.units = Salas de Conferencias
stat.server_sessions.name = Conexiones entre servidores
stat.server_sessions.desc = N\u00famero de conexiones entre servidores.
stat.server_sessions.units = Conexiones entre servidores
stat.sessions.name = Conexiones de Clientes
stat.sessions.desc = N\u00famero de Clientes Conectados directamente al servidor.
stat.sessions.units = Conexiones de Clientes
stat.packet_count.name = Cantidad de Paquetes
stat.packet_count.desc = N\u00famero de Paquetes Enviados y Recibidos por Openfire.
stat.packet_count.units = Paquetes por Minuto
stat.conversation.name = Conversaciones
stat.conversation.desc = Conversaciones entre usuarios.
stat.conversation.units = Conversaciones
# Enterprise Bookmarks
users = Usuarios
groups = Grupos
options = Opciones
cancel = Cancelar
create = Crear
group.chat.bookmark.title = Salas de Conferencias Favoritas
group.chat.bookmark.description = Agrega salas de conferencias como favoritos. Cada favorito puede ser asignado a individuos particulares o grupos (o todos los usuarios).
group.chat.bookmark.created = Sala de Conferencia Favorita ha sido creada.
group.chat.bookmark.removed = Group chat bookmark removed.
group.chat.bookmark.name = Nombre de Sala de Conferencia
group.chat.bookmark.address = Direcci\u00f3n de Sala de Conferencia
group.chat.bookmark.autojoin = Ingresar-Autom\u00e1ticamente
group.chat.bookmark.users = usuario(s)
group.chat.bookmark.groups = grupo(s)
group.chat.bookmark.none = Actualmente no tiene salas de conferencias favoritas. Haga clic en 'Agregar Sala de Conferencia Favorita' para agregar una nueva sala de conferencia.
group.chat.bookmark.add = Agregar Sala de Conferencia Favorita
bookmark.edit = Editar Favoritos
bookmark.create = Crear Favorito
bookmark.created = Un nuevo favorito ha sido creado.
bookmark.url.name = Nombre del URL
bookmark.url.name.description = eg. Nuestro Sitio web Interno
bookmark.url = URL
bookmark.url.manager.title = Administrador de Favoritos de URLs
bookmark.url.manager.description = Permite a usuarios crear URLs Favoritos en sus clientes. Los URLs Favoritos \
permiten tener un acceso r\u00e1pido a enlaces frecuentemente usados desde los clientes.
bookmark.url.success = Un nuevo URL Favorito ha sido creado.
bookmark.url.deleted = Favorito borrado.
bookmark.url.users = Usuarios
bookmark.url.groups = Grupos
bookmark.url.rss = RSS
bookmark.url.options = Opciones
bookmark.url.no.bookmarks = Actualmente no tiene URLs favoritos. Haga clic en 'Agregar URL Favorito' para agregar un nuevo URL favorito.
bookmark.url.add = Agregar URL Favorito
bookmark.create.rss.feed = Importaci\u00f3n RSS:
bookmark.create.all.users = Todos los Usuarios
bookmark.url.error = Especifique el url a utilizar.
bookmark.browse.users = Consultar Usuarios
bookmark.browse.groups = Consultar Grupos
bookmark.users.groups.error = Debe especificar usuarios y/o grupos para crear una direcci\u00f3n favorita v\u00e1lida.
bookmark.save.changes = Salvar Cambios
bookmark.urlName.error = Especifique el nombre del url.
bookmark.groupchat.name.error = Especifique el nombre de la conferencia.
bookmark.groupchat.address.error = Especifique una direcci\u00f3n v\u00e1lida de la sala de conferencia.
bookmark.url.create.description = Crea un nuevo URL favorito utilizando el siguiente formulario.
bookmark.groupchat.create.description = Crea una nueva sala de conferencia favorita utilizando el siguiente formulario.
bookmark.url.edit.description = Editar URL favorito utilizando el siguiente formulario.
bookmark.groupchat.edit.description = Editar sala de conferencia favorita utilizando el siguiente formulario.
bookmark.delete.confirm = \u00bfBorrar esta direcci\u00f3n favorita?
bookmark.delete.confirm.prompt = \u00bfEst\u00e1 seguro que desea eliminar esta direcci\u00f3n favorita?
bookmark.delete.url.urlname = Nombre del URL:
bookmark.delete.url.url = URL:
bookmark.delete.url.users = Usuarios:
bookmark.delete.url.groups = Grupos:
bookmark.delete.url.submit = Borrar
bookmark.delete.url.cancel = Cancelar
bookmark.delete.chat.groupname = Nombre de la Conferencia:
bookmark.delete.chat.address = Direcci\u00f3n de la Sala de Conferencia:
bookmark.delete.chat.users = Usuarios:
bookmark.delete.chat.groups = Grupos:
bookmark.delete.chat.autojoin = Ingresar-Autom\u00e1ticamente:
bookmark.delete.chat.submit = Borrar
bookmark.delete.chat.cancel = Cancelar
# Dashboard
dashboard.title = Consola de Openfire
dashboard.description = Una foto de la actividad actual en Openfire.
dashboard.directions = Haga clic en los gr\u00e1ficos para obtener una ampliaci\u00f3n.
dashboard.snapshot.enlarge = Agrandar Gr\u00e1fico
dashboard.snapshot.shrink = Encoger Gr\u00e1fico
dashboard.timespan = Per\u00edodo:
dashboard.timespan.lasthour = 1 Hora
dashboard.timespan.last24hours = 24 Horas
dashboard.timespan.last7days = 7 D\u00edas
dashboard.spotlights.high = M\u00e1x:
dashboard.spotlights.low = M\u00edn:
dashboard.spotlights.packetactivity = Paquetes Por Minuto
dashboard.spotlights.activeconversations = Conversaciones Vigentes
dashboard.spotlights.currentusers = Usuarios Actuales
dashboard.quickstats = Estad\u00edsticas R\u00e1pidas
dashboard.quickstats.high = M\u00e1x
dashboard.quickstats.low = M\u00edn
dashboard.currentconversations = Conversaciones Vigentes
dashboard.currentconversations.details = ver detalles
dashboard.currentconversations.users = Usuarios
dashboard.currentconversations.lastactivity = \u00daltima Actividad
dashboard.currentconversations.messagecount = Mensajes
dashboard.currentconversations.none = No hay conversaciones vigentes.
# All Reports
allreports.title = Todos los Reportes
allreports.daterange = Rango de Fechas
allreports.daterange.preset = Programadas
allreports.daterange.preset.last60minutes = \u00daltimos 60 minutos
allreports.daterange.preset.last24hours = \u00daltimas 24 horas
allreports.daterange.preset.thisweek = Esta semana
allreports.daterange.preset.last7days = \u00daltimos 7 d\u00edas
allreports.daterange.preset.lastweek = Semana pasada
allreports.daterange.preset.thismonth = Este mes
allreports.daterange.preset.lastmonth = Mes pasado
allreports.daterange.preset.last3months = \u00daltimos 3 meses
allreports.daterange.specific = Espec\u00edfico
allreports.daterange.specific.startdate = Inicio:
allreports.daterange.specific.enddate = Fin:
allreports.daterange.startdate.error = Ingrese una fecha de inicio en el formato mm/dd/yy.
allreports.daterange.enddate.error = Ingrese una fecha de fin en el formato mm/dd/yy.
allreports.selectreport = Seleccione Reporte
allreports.download.allreports = Descargar Todos los Reportes
allreports.download.allreports.pdf = PDF
allreports.download.allreports.pdf.format = Formato PDF
allreports.download.singlereport = Descargar este reporte:
allreports.download.singlereport.pdf = PDF
allreports.reportinformation = Informaci\u00f3n del Reporte
muc.conversation.joined={0} ({1}) ha ingresado al cuarto
muc.conversation.joined.anonymous={0} (anonimo) ha ingresado al cuarto
muc.conversation.left={0} ({1}) se ha ido del cuarto
muc.conversation.left.anonymous={0} (anonimo) se ha ido del cuarto
license.display.members=Miembros del Cluster
dashboard.group_conversation=Conversacion de Grupo
archive.settings.group_chats=Archivar charlas de grupos
archive.search.group_conversation=Charla de Grupo: {0}
archive.group_conversation={0}Conversacion de Grupo{1}
archive.group_conversation.close=Cerrar
archive.group_conversation.participants=Participantes
archive.group_conversation.participants.empty=No se han encontrado participantes.
archive.group_conversation.participants.participant=Usuarios
archive.group_conversation.participants.title=Participantes de la charla de Grupo
admin.item.sparkweb.description=Haga clic para comenzar SparkWeb
admin.item.sparkweb.name=SparkWeb
admin.item.webclient=Cliente Web
archive.settings.certain_rooms=S\u00f3lo archivar conversaciones de los siguientes cuartos (separar con coma)
archive.settings.one_to_one=Archivar charlas uno-a-uno
\ No newline at end of file
# Java Resource Bundle
# Modified by Zaval JRC Editor (C) Zaval CE Group
# http://www.zaval.org/products/jrc-editor/
#
admin.item.active-conversations.description=Cliquez pour voir les conversations en cours.
admin.item.active-conversations.name=Conversations
admin.item.archive-search.description=Cliquez pour rechercher dans les archives.
admin.item.archive-search.name=Recherche Archive
admin.item.archive-settings.description=Cliquez pour param\u00e9trer l'archivage.
admin.item.archive-settings.name=Param\u00e8tres d'Archivage
admin.item.client-features.description=Cliquez pour activer ou d\u00e9sactiver les modules client.
admin.item.client-features.name=Dispositifs Client
admin.item.client-version.description=Cliquez pour configurer quelles applications client pourront se connecter a votre serveur.
admin.item.client-version.name=Clients Authoris\u00e9s
admin.item.groupchat-bookmarks.description=Cliquez pour administrer les signets "group chat" des utilisateurs
admin.item.groupchat-bookmarks.name=Signets Group Chat
admin.item.license.description=Cliquez pour voir votre license.
admin.item.license.name=License
admin.item.spark-download.description=T\u00e9l\u00e9charger Spark.
admin.item.spark-download.name=T\u00e9l\u00e9charger Spark
admin.item.spark-version.description=Cliquez pour restreindre la version Spark correspondante a chaque plate-forme.
admin.item.spark-version.name=Version Spark
admin.item.stats-dashboard.description=Voir le r\u00e9sum\u00e9 des statistiques serveur.
admin.item.stats-dashboard.name=Tableau de Bord
admin.item.stats-reporter.description=Voir les rapports d\u00e9taill\u00e9s des statistiques serveur.
admin.item.stats-reporter.name=Rapports
admin.item.url-bookmarks.description=Cliquez pour administrer les signets URL des utilisateurs
admin.item.url-bookmarks.name=Signets URL
admin.sidebar.archiving.description=Param\u00e8tres d'Archivage Openfire Entreprise
admin.sidebar.archiving.name=Archivage
admin.sidebar.client.description=Administrer les Modules Client et les Deploiements Spark
admin.sidebar.client.name=Administration des Clients
admin.sidebar.general.description=Param\u00e8tres G\u00e9n\u00e9raux Openfire Entreprise
admin.sidebar.general.name=G\u00e9n\u00e9ral
admin.sidebar.statistics.description="Statistiques Openfire Entreprise
admin.sidebar.statistics.name=Statistiques
admin.tab.enterprise.description=Openfire Entreprise
admin.tab.enterprise.name=Entreprise
allreports.daterange=Dates
allreports.daterange.enddate.error=Veuillez s\u00e9l\u00e9ctionner une date avant demain dans le format mm/jj/aa
allreports.daterange.preset=Pr\u00e9s\u00e9lection
allreports.daterange.preset.last24hours=Dernieres 24 heures
allreports.daterange.preset.last3months=3 dernier mois
allreports.daterange.preset.last60minutes=60 derniere minutes
allreports.daterange.preset.last7days=7 dernier jours
allreports.daterange.preset.lastmonth=Mois Pr\u00e9c\u00e9dent
allreports.daterange.preset.lastweek=Semaine Pr\u00e9c\u00e9dente
allreports.daterange.preset.thismonth=Ce mois-ci
allreports.daterange.preset.thisweek=Cette Semaine
allreports.daterange.specific=Sp\u00e9cifique
allreports.daterange.specific.enddate=Fin:
allreports.daterange.specific.startdate=D\u00e9but:
allreports.daterange.startdate.error=Veuillez entrer une date de d\u00e9but au format mm/jj/aa
allreports.download.allreports=T\u00e9l\u00e9charger tous les Rapports
allreports.download.allreports.pdf= PDF
allreports.download.allreports.pdf.format=Format PDF
allreports.download.singlereport=T\u00e9l\u00e9charger ce rapport:
allreports.download.singlereport.pdf=PDF
allreports.reportinformation=Information sur le Rapport
allreports.selectreport=Choisissez un Rapport
# All Reports
allreports.title=Rapports
archive.converations.no_conversations=Aucune conversation en cours.
archive.conversations=Conversations en cours:
archive.conversations.duration=Dur\u00e9e
archive.conversations.lastactivity=Derni\u00e8re Activit\u00e9
archive.conversations.messages=Messages
archive.conversations.users=Utilisateurs
archive.search.daterange=Dates:
archive.search.daterange.any=N'importe
archive.search.daterange.end=Fin:
archive.search.daterange.error=L'heure de fin doit etre apr\u00e8s l'heure de d\u00e9part.
archive.search.daterange.format=Utilisez mm/jj/aa
archive.search.daterange.start=D\u00e9part:
archive.search.daterange.tooltip=Veuillez entrer les dates ente lequelles vous souhaitez rechercher. Vous pouvez choisir une date de d\u00e9part et/ou une date de fin.
archive.search.keywords=Mots-Cl\u00e9s:
archive.search.keywords.disabled=La recherche par Mot-Cl\u00e9s a \u00e9t\u00e9 d\u00e9sactiv\u00e9e. Pour l'activer, vous devez aussi activer l'archivage des messages dans l'onglet {0}Param\u00e8tres d'Archivage{1}.
archive.search.keywords.optional= (option)
archive.search.participants=Participant(s):
archive.search.participants.any=N'importe
archive.search.participants.browse=Parcourir
archive.search.participants.tooltip=Veuillez entrer ou s\u00e9l\u00e9ctionner le nom du participant que vous recherchez. Vous pouvez aussi entrer celui d'un autre participant afin d'affiner votre recherche sur des conversations en particulier.
archive.search.pdf.duration=Dur\u00e9e:
archive.search.pdf.messagecount=Nombre de Messages:
archive.search.pdf.participants=Participants:
archive.search.pdf.startdate=Date de D\u00e9part:
archive.search.pdf.title=Transcript de la Conversation:
archive.search.results=R\u00e9sultats de la Recherche:
archive.search.results.archive_disabled=Les messages de cette conversation n'ont pas \u00e9t\u00e9 archiv\u00e9s.
archive.search.results.date=Date:
archive.search.results.description=Votre recherche a donn\u00e9 {0} r\u00e9sultats. S\u00e9lectionnez un r\u00e9sultat \u00e0 gauche pour consulter la conversation.
archive.search.results.duration=Dur\u00e9e:
archive.search.results.messagecount=Nombre de Messages:
archive.search.results.none=Aucune conversations n'ont \u00e9t\u00e9 trouv\u00e9es avec les crit\u00e8res de recherche sp\u00e9cifi\u00e9s. Veuillez modifier vos crit\u00e8res et r\u00e9essayer.
archive.search.results.participants=Participants:
archive.search.results.xofy=de(s)
archive.search.submit=Rechercher
archive.search.title=Rechercher dans les Archives
archive.settings.any=N'importe
archive.settings.cancel=Annuler
archive.settings.conversation.count=Nombre de Conversations Archiv\u00e9es
archive.settings.conversation.count.description=Le total des conversations archiv\u00e9es.
archive.settings.current.index=Index de Recherche Courant
archive.settings.current.index.description=La taille actuelle des indexes de message.
archive.settings.description=Utilisez le formulaire ci-dessous pour administrer les param\u00e8tres d'archivage.
archive.settings.enable.message=Archivage des Messages
archive.settings.enable.message.description=Archiver le texte des tous les messages envoy\u00e9s entre les utilisateurs. Le texte des messages pourra \u00eatre recherch\u00e9 par mot-cl\u00e9.
archive.settings.enable.metadata=Archivage des Etats de Conversation
archive.settings.enable.metadata.description=Enregistrer qui discute avec qui, combin de temps dure leurs conversations et le nombre exact de messages dans chaque conversation. Le contenu des messages ne sera pas enregistr\u00e9 \u00e0 mois que l'archivage des messages soit activ\u00e9.
archive.settings.idle.time=Temps Idle
archive.settings.idle.time.description=Le nombre de minutes d'idle autoris\u00e9 durant une conversation avant qu'elle ne soit coup\u00e9e automatiquement.
archive.settings.index.settings=Param\u00e8tres d'Indexage
archive.settings.index.settings.description=Voir et/ou reconstruire les indexes de recherche.
archive.settings.max.time=Temps Max
archive.settings.max.time.description=Le nombre de minutes maximum d'une conversation avant qu'elle ne soit coup\u00e9e automatiquement.
archive.settings.message.count=Nombre de messages archiv\u00e9s
archive.settings.message.count.description=Le nombre total de messages archiv\u00e9s.
archive.settings.message.metadata.description=Activer ou D\u00e9sactiver l'archivage des messages et/ou metadata.
archive.settings.message.metadata.title=Param\u00e8tres de Message et Metadata
archive.settings.rebuild=R\u00e9-indexer
archive.settings.rebuild.success=Le re-indexage est en cours.
archive.settings.success=Les param\u00e8tres d'archivage ont \u00e9t\u00e9 enregistr\u00e9s.
archive.settings.title=Param\u00e8tres d'Archivage
archive.settings.update.settings=Param\u00e8tres de Mise \u00e0 jour
bookmark.browse.groups=Parcourir les Groupes
bookmark.browse.users=Parcourir la liste des Utilisateurs
bookmark.create=Cr\u00e9er un Signet
bookmark.create.all.users=Tous les Utilisateurs
bookmark.create.rss.feed=Flux RSS:
bookmark.created=Un nouveau signet a \u00e9t\u00e9 cr\u00e9e.
bookmark.delete.chat.address=Adresse "Group Chat"
bookmark.delete.chat.autojoin=Auto-Join:
bookmark.delete.chat.cancel=Annuler
bookmark.delete.chat.groupname=Nom du "Group Chat":
bookmark.delete.chat.groups=Groupes:
bookmark.delete.chat.submit=Effacer
bookmark.delete.chat.users=Utilisateurs:
bookmark.delete.confirm=Effacer ce Signet?
bookmark.delete.confirm.prompt=Etes-vous sur de bien vouloir effacer ce signet?
bookmark.delete.url.cancel=Annuler
bookmark.delete.url.groups=Groupes:
bookmark.delete.url.submit=Effacer
bookmark.delete.url.url=URL:
bookmark.delete.url.urlname=Nom de l'URL:
bookmark.delete.url.users=Utilisateurs:
bookmark.edit=Editer le Signet
bookmark.groupchat.address.error=Veuillez entrer une adresse de salon valide.
bookmark.groupchat.create.description=Cr\u00e9er un nouveau signet de salon en utilisant le formulaire ci-dessous.
bookmark.groupchat.edit.description=Editer un signet de salon en utilisant le formulaire ci-dessous.
bookmark.groupchat.name.error=Veuillez entrer le nom du "Group Chat".
bookmark.save.changes=Enregistrer les Modifications
bookmark.url=URL
bookmark.url.add=Ajouter le signet d'URL
bookmark.url.create.description=Cr\u00e9er un nouveau signet d'URL en utilisant le formulaire ci-dessous
bookmark.url.deleted=Signet d'URL effac\u00e9.
bookmark.url.edit.description=Editer le signet d'URL en utilisant le formulaire ci-dessous.
bookmark.url.error=Veuillez entrer l'adresse url a utiliser.
bookmark.url.groups=Groupes
bookmark.url.manager.description=Permet la cr\u00e9ation de signet d'URL dans le client IM de l'utilisateur. Les signets d'URL ci-dessous permettent l'acc\u00e8s rapide aux adresses frequemment consult\u00e9es, directement depuis le client de l'utilisateur.
bookmark.url.manager.title=Administration des Signets d'URL
bookmark.url.name=Nom
bookmark.url.name.description=ex: Notre Intranet
bookmark.url.no.bookmarks=Vous n'avez aucun signet d'URL pour l'instant. Cliquez sur 'Ajouter un signet d'URL' pour en ajouter un.
bookmark.url.options=Options
bookmark.url.rss=RSS
bookmark.url.success=Un signet d'URL a \u00e9t\u00e9 cr\u00e9e.
bookmark.url.users=Utilisateurs
bookmark.urlName.error=Veuillez sp\u00e9cifier le nom de l'URL.
bookmark.users.groups.error=Veuillez s\u00e9lectionner les utilisateurs et/ou les groupes pour cr\u00e9er un signet valide.
cancel=Annuler
client.feature=Module
client.features.broadcasting=Diffusion
client.features.broadcasting.description=Permet d'envoyer un message a certains groupes ou tout un roster.
client.features.disabled=D\u00e9sactiv\u00e9
client.features.enabled=Activ\u00e9
client.features.filetransfer=Transfert de Fichiers
client.features.filetransfer.description=Permet de d'envoyer des fichiers entre utilisateurs.
client.features.groupchat=Group Chat
client.features.groupchat.description=Permet d'entrer dans les Salons "Group Chat"
client.features.info=Utiliser le formulaire ci-dessous pour activer ou d\u00e9sactiver des modules client. NB: Certaines restrictions client ne s'appliquent seulement au client Spark.
client.features.save.settings=Enregistrer les Param\u00e8tres
client.features.spark.only=(Seulement applicable \u00e0 Spark)
# Enteprise Spark Manager
client.features.title=Modules Client
client.features.update.features=Les permissions de module ont \u00e9t\u00e9 mise \u00e0 jour:
client.features.vcard=Avatar/VCard
client.features.vcard.description=Permet aux utilisateurs de changer leur profils et avatars.
create=Cr\u00e9er
dashboard.currentconversations=Conversations en cours
dashboard.currentconversations.details=Voir les d\u00e9tails
dashboard.currentconversations.lastactivity=Derni\u00e8re activit\u00e9
dashboard.currentconversations.messagecount=Messages
dashboard.currentconversations.none=Aucune conversation en cours.
dashboard.currentconversations.users=Utilisateurs
dashboard.description=Un "snapshot" de l'activit\u00e9 sur Openfire
dashboard.directions=Cliquez sur les graphes ci-dessous pour les agrandir.
dashboard.quickstats=Stats
dashboard.quickstats.high=Haut
dashboard.quickstats.low=Bas
dashboard.snapshot.enlarge=Agrandir
dashboard.snapshot.shrink=R\u00e9duire
dashboard.spotlights.activeconversations=Conversqtions en cours
dashboard.spotlights.currentusers=Utilisateurs courant
dashboard.spotlights.high=Haut:
dashboard.spotlights.low=Bas:
dashboard.spotlights.packetactivity=Paquets par minute
dashboard.timespan=Periode:
dashboard.timespan.last24hours=24 heures
dashboard.timespan.last7days=7 jours
dashboard.timespan.lasthour=1 Heure
# Dashboard
dashboard.title=Tableau de Bord Openfire
error.exception=Exception:
group.chat.bookmark.add=Ajouter un Signet "Group Chat"
group.chat.bookmark.address=Adresse "Group Chat"
group.chat.bookmark.autojoin=Auto-Join
group.chat.bookmark.created=Le signet "Group Chat" a \u00e9t\u00e9 cr\u00e9e.
group.chat.bookmark.description=Cr\u00e9er des signets pour les salons ci-dessous. Chaque signet peut \u00eatre assign\u00e9 \u00e0 un individu ou groupe (ou a tous les utilisateurs).
group.chat.bookmark.groups=groupe(s)
group.chat.bookmark.name=Nom du "Group Chat"
group.chat.bookmark.none=Vous n'avez aucun signet "Group Chat". Cliquez sur 'Ajouter un signet Group Chat' pour en ajouter un.
group.chat.bookmark.removed=Signet effac\u00e9
group.chat.bookmark.title=Signets Group Chat
group.chat.bookmark.users=utilisateur(s)
groups=Groupes
license.alt=Vous pouvez aussi copier le fichier enterprise.license dans le dossier suivant (il se peut que vous ayez \u00e0 redemmarer le serveur)
license.details=License Openfire Entreprise
license.display.created=License Cr\u00e9e
license.display.expires=License Expire
license.display.max_users=Maximum Utilisateurs
license.display.no_creation_date=Inconnue
license.display.no_expires_date=Jamais
license.display.type=Type de License
license.error=Erreur de License
license.error.no_license = No License Found
license.error.default=Une erreur s'est produite en validant votre license. Veuillez entrer une license valide.
license.error.expired=Votre License a expir\u00e9e. Veuillez entrer une nouvelle license.
license.error.invalid=Le fichier de license est invalide ou corrompu. Veuillez entrer une license valide.
license.error.not_found=Aucun fichier de license n'a \u00e9t\u00e9 trouv\u00e9. Veuillez entrer le fichier de license ci dessous. Si vous n'avez pas d\u00e9j\u00e0 de license, vous pouvez vous enregistrer pour une license d'essai de 30 jours sur <a href="http://www.jivesoftware.com/products/openfire/eval_landing.jsp" target="_blank">jivesoftware.com</a>
license.error.parse_error=Le texte de la license n'a pas pu \u00eatre pars\u00e9. Veuillez copier-coller le texte complet de la license.
license.error.too_many_users=Vous avez d\u00e9pass\u00e9 le maximum d'utilisateurs qu'autorise votre license. Deconnectez des utilisateurs ou entrez un nouveau fichier de license autorisant plus d'utilisateurs.
license.eval.body=Votre \u00e9valuation de Openfire Entreprise expire dans {0} jour(s). Contactez notre {1}d\u00e9partement commercial{2} pour obtenir une nouvelle license.
license.expiration.header = Days Until License Expires: {0}
license.expiration.body = Your Openfire Enterprise license will expire in {0} day(s). Please \
contact our {1}sales team{2} to purchase a new license.
license.maintenance.header = Days Until Maintenance Expires: {0}
license.maintenance.body = Your Openfire Enterprise maintenance will expire in {0} day(s). Please \
contact our {1}sales team{2} to purchase a new license.
license.eval.header=Jours restants en \u00e9valuation: {0}
license.eval.mini.multi_day={0} jours
license.eval.mini.single_day=1 jour
license.expand=Etendre
license.new_license.description=Pour entrer votre cl\u00e9 de license, copier-coller le contenu de votre fichier enterprise.license dans le champ ci-dessous.
license.new_license.title=Entrez votre License
license.shrink=R\u00e9duire
license.submit=Envoyer
license.title=Information de license
license.update_license.cancel=Annuler
license.update_license.description=Copier-coller le contenu de votre fichier enterprise.license dans le champ ci-dessous
license.update_license.title=Mettre \u00e0 Jour la License
license.update_license.update=Mettre \u00e0 Jour la License
license.updated=License mise \u00e0 jour termin\u00e9.
# Enterprise
login.title=Console d'Administration
options=Options
permitted.client.add=Ajouter
permitted.client.add.other.client=Ajouter un autre Client
permitted.client.all.clients=Tous les Clients
permitted.client.all.clients.description=Permettre \u00e0 tous les clients XMPP de se connecter. Il est recommand\u00e9 d'activer ce param\u00e8tre \u00e0 moins d'avoir des directives plus strictes de contr\u00f4le client.
permitted.client.description=Utilisez le formulaire ci-dessous pour restreindre l'acc\u00e8s \u00e0 certains clients.
permitted.client.legend=Clients Autoris\u00e9s \u00e0 se connecter
permitted.client.remove=enlever
permitted.client.save.settings=Enregitrer les param\u00e8tres
permitted.client.specific.clients=Sp\u00e9cifiez le(s) Client(s)
permitted.client.success=Les param\u00e8tres de version du client ont \u00e9t\u00e9 enregistr\u00e9s.
permitted.client.title=Clients Autoris\u00e9s
permitted.client.tooltip=Entrez le nom du client tel que vous le voyez dans le "Software Version check". Le nom que vous allez entrer doit faire<br>partie de la chaine de caract\u00e8res du "fetch call".
permitted.client.website=website
plugin.description=Openfire \u00e9dition Entreprise (Commercial).
plugin.name=Openfire Entreprise
spark.download.emailtemplate=Matrice Email
spark.download.emailtemplate.instructions=Vous pouvez utiliser le texte suivant comme matrice pour indiquer aux utilisateurs o\u00f9 t\u00e9l\u00e9charger le client d'IM Spark.
spark.download.emailtemplate.template.part1=Nous avons d\u00e9ploy\u00e9 un nouveau syst\u00e8me de messagerie avec le serveur Openfire et sont client de messagerie s\u00e9curis\u00e9 Spark. La mise en route ne prends que quelques minutes, t\u00e9l\u00e9chargez l'installeur sur:
spark.download.emailtemplate.template.part2=Une fois l'installation termin\u00e9e, le client vous notifieras automatiquement lorsque des mises \u00e0 jour seront disponible.
spark.download.emailtemplate.template.part3=Lorsque le programme d\u00e9marrera, entrez votre nom d'utilisateur et votre mot de passe ainsi que le nom du serveur {0}.
spark.download.emailtemplate.template.part4=Veuillez me contacter pour votre nom d'utilisateur et mot de passe.
spark.download.instructions=Pour t\u00e9l\u00e9charger Spark directement, utilisez les liens suivants:
spark.download.mac=Mac OSX:
spark.download.nix=Linux/Unix:
spark.download.nobuild=Pas de build disponible.
spark.download.title=T\u00e9l\u00e9chargement de Spark
spark.download.windows=Windows:
spark.version.form.builds=Placez votre build dans le r\u00e9pertoir suivant:
spark.version.form.button=T\u00e9l\u00e9chargez (upload) Spark
spark.version.form.clients.active=Activ\u00e9
spark.version.form.clients.date=Date
spark.version.form.clients.mac=Clients Mac
spark.version.form.clients.name=Nom du Client
spark.version.form.clients.nix=Client Linux/Unix
spark.version.form.clients.nobuilds=Pas de builds disponibles
spark.version.form.clients.windows=Clients Windows
spark.version.form.confirmation.build=Informations du build mise \u00e0 jour.
spark.version.form.confirmation.upload=Nouveau fichier Spark T\u00e9l\u00e9charg\u00e9.
spark.version.form.optional=Message Optionnel
spark.version.form.optional.instructions=Utilisez le champ ci-dessous pour mettre un message que chaque client affichera lors du t\u00e9l\u00e9chargement du dernier build.
spark.version.form.update=Mettre a jour les versions Spark
spark.version.form.upload=Uploader le client Spark:
spark.version.instructions=Specifiez la version de Spark que vos utilisateurs pourront utiliser pour chaque syst\u00e8me d'exploitation. Si vous d\u00e9ployez une nouvelle version, les utilisateurs seront automatiquement notifi\u00e9 avec les instructions pour la mise \u00e0 jour.
spark.version.title=Version de Spark
stat.active_group_chats.desc=Le nombre de salons "Group chat" actifs.
stat.active_group_chats.name=Group Chat: Salons
stat.active_group_chats.units=Salons
stat.conversation.desc=Conversations entre utilisateurs
stat.conversation.name=Conversations
stat.conversation.units=Conversations
stat.packet_count.desc=Nombre de paquets envoy\u00e9s et re\u00e7us par Openfire.
stat.packet_count.name=Nombre de Paquets
stat.packet_count.units=Paquets par Minute
stat.sessions.desc=Nombre de clients connect\u00e9s directement au serveur.
stat.sessions.name=Connexions Client
stat.sessions.units=Connexions Client
stat.server_sessions.desc=No nombre de connexion Serveur \u00e0 Serveur
stat.server_sessions.name=Connexions Serveur \u00e0 Serveur
stat.server_sessions.units=Conexions S2S
# Enterprise Bookmarks
users=Utilisateurs
# $RCSfile$
# $Revision: 3148 $
# $Date: 2005-12-01 14:50:45 -0300 (Thu, 01 Dec 2005) $
##
## Enterprise Resource Bundle
##
## Additional locales can be specified by creating a new resource file in this
## directory using the following conventions:
##
## enterprise_i18n "_" language "_" country ".properties"
## enterprise_i18n "_" language ".properties"
##
## e.g.
## enterprise_i18n_en.propertis <- English resources
## enterprise_i18n_en_US.properties <- American US resources
## enterprise_i18n_de.properties <- German resources
## enterprise_i18n_ja.properties <- Japanese resources
##
## Please note that the two digit language code should be lower case, and the
## two digit country code should be in uppercase. Often, it is not necessary to
## specify the country code.
##
## A full list of language codes can be found at
## http://www-old.ics.uci.edu/pub/ietf/http/related/iso639.txt
## and a full list of country codes can be found at
## http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
##
## In property strings that are parameterized, single quotes can be used to
## quote the "{" (curly brace) if necessary. A real single quote is represented by ''.
##
## REVISION HISTORY (by Enterprise version):
##
## 3.0.0
## Initial Release
## 3.1.1
## Added key: 'license.error.no_license'
## Updated key: 'license.error.not_found'
## 3.2.0
## Added key: 'license.expiration.header'
## Added key: 'license.expiration.body'
## Added key: 'license.maintenance.header'
## Added key: 'license.maintenance.body'
# Enterprise
login.title = Console Administrativo
error.exception = Exce\u00e7\u00e3o:
plugin.name=Openfire Enterprise
plugin.description=Enterprise Edition of Openfire.
admin.tab.enterprise.name=Enterprise
admin.tab.enterprise.description=Openfire Enterprise
admin.sidebar.statistics.name=Estat\u00edsticas
admin.sidebar.statistics.description=Estat\u00edsticas da Openfire Enterprise
admin.item.stats-dashboard.name=Painel
admin.item.stats-dashboard.description=Ver descri\u00e7\u00e3o das estat\u00edsticas do servidor.
admin.item.stats-reporter.name=Todos os Relat\u00f3rios
admin.item.stats-reporter.description=Ver relat\u00f3rios detalhados das estat\u00edsticas do servidor.
admin.sidebar.archiving.name=Arquivamento
admin.sidebar.archiving.description=Ajustes de Arquivamento do Openfire Enterprise
admin.item.archive-search.name=Arquivo de busca
admin.item.archive-search.description=Clique para procurar aquivos.
admin.item.archive-settings.name=Ajustes de Arquivamento
admin.item.archive-settings.description=Clique para configurar arquivamento.
admin.item.active-conversations.name=Conversas
admin.item.active-conversations.description=Clique para ver conversas ativas.
admin.sidebar.client.name=Gerenciamento de cliente
admin.sidebar.client.description=Gerenciar Funcionalidades de Cliente e Instala\u00e7\u00e3o do Spark
admin.item.client-features.name=Funcionalidades de Cliente
admin.item.client-features.description=Clique para habilitar e desabilitar funcionalidades de cliente.
admin.item.client-version.name=Clientes Autorizados
admin.item.client-version.description=Clique para configurar quais aplica\u00e7\u00f5es do cliente podem se conectar ao seu \
servidor.
admin.item.groupchat-bookmarks.name=Marcadores de Salas de Bate-Papo
admin.item.groupchat-bookmarks.description=Clique para gerenciar marcadores de salas de bate-papo dos usu\u00e1rios.
admin.item.url-bookmarks.name=Marcadores de URL
admin.item.url-bookmarks.description=Clique para gerenciar marcadores de URL para usu\u00e1rios.
admin.item.spark-version.name=Vers\u00e3o Spark
admin.item.spark-version.description=Clique para ajustar a vers\u00e3o do cliente Spark para cada plataforma.
admin.item.spark-download.name=Download do Spark
admin.item.spark-download.description=Download do Spark.
admin.sidebar.general.name=Geral
admin.sidebar.general.description=Ajustes gerais da Openfire Enterprise.
admin.item.license.name=Informa\u00e7\u00f5es sobre licen\u00e7a
admin.item.license.description=Clique para ver informa\u00e7\u00f5es sobre licen\u00e7a.
license.eval.header = Dias Restantes em Avalia\u00e7\u00e3o: {0}
license.eval.body = Sua avalia\u00e7\u00e3o do Openfire Enterprise expira em {0} dia(s). Contacte nosso {1}revendedor{2} para \
adquirir uma licen\u00e7a.
license.expiration.header = Licen\u00e7a expira em: {0} dia(s)
license.expiration.body = Sua licen\u00e7a do Openfire Enterprise expira em {0} dia(s). Por favor, contacte nosso \
{1}revendedor{2} para adquirir uma nova licen\u00e7a.
license.maintenance.header = Manuten\u00e7\u00e3o Expira em: {0} dia(s)
license.maintenance.body = Sua manuten\u00e7\u00e3o do Openfire Enterprise expira em {0} dia(s). Por favor, contacte nosso \
{1}revendedor{2} para adquirir uma nova licen\u00e7a.
license.eval.mini.multi_day = {0} dias
license.eval.mini.single_day = 1 dia
license.shrink = Encolher
license.expand = Expandir
license.title = Informa\u00e7\u00f5es sobre licen\u00e7a
license.error = Erro de Licen\u00e7a
license.error.no_license = Licen\u00e7a N\u00e3o Encontrada
license.error.parse_error = O texto da licen\u00e7a n\u00e3o pôde ser analizado. Por favor, cole uma licen\u00e7a completa.
license.error.expired = A licen\u00e7a expirou. Por favor, insira uma licen\u00e7a atualizada.
license.error.invalid = O arquivo de lincen\u00e7a est\u00e1 inv\u00e1lido ou corrompido. Por favor, insira uma licen\u00e7a v\u00e1lida.
license.error.default = Ocorreu um erro ao validar o arquivo de licen\u00e7a. Por favor, insira uma licen\u00e7a v\u00e1lida.
license.error.not_found = <p>Nenhum arquivo de licen\u00e7a foi encontrado. Por favor, insira um arquivo de licen\u00e7a\
abaixo.</p> <p><b>Precisa de uma licen\u00e7a para avalia\u00e7\u00e3o?</b> Registre para uma licen\u00e7a de 30 dias em \
<a href="http://www.jivesoftware.com/products/openfire/eval_landing.jsp" target="_blank">jivesoftware.com</a>.</p>
license.error.too_many_users = Voc\u00ea excedeu o n\u00famero m\u00e1ximo de usu\u00e1rios permitido em sua licen\u00e7a. \
Disconecte usu\u00e1rios ou insira um novo arquivo de licen\u00e7a.
license.updated = Licen\u00e7a atualizada com sucesso.
license.details = Detalhes da Licen\u00e7a da Openfire Enterprise
license.display.type = Tipo de Licen\u00e7a
license.display.expires = Licen\u00e7a Expira
license.display.created = Licen\u00e7a Criada
license.display.max_users = N\u00famero M\u00e1ximo de Usu\u00e1rios
license.display.no_expires_date = Nunca
license.display.no_creation_date = Desconhecido
license.new_license.title = Insira Licen\u00e7a
license.new_license.description = Para inserir sua chave de licen\u00e7a, copie e cole o conte\u00fado do seu \
arquivo enterprise.license no campo abaixo.
license.update_license.update = Atualizar Licen\u00e7a
license.update_license.cancel = Cancelar
license.update_license.title = Atualizar Licen\u00e7a
license.update_license.description = Copie e cole o conte\u00fado do seu arquivo enterprise.license \
no campo abaixo.
license.alt = Voc\u00ea tamb\u00e9m pode copiear o arquivo enterprise.license para o sequinte \
local (pode requerer a reinicializa\u00e7\u00e3o do servidor para surgir efeito)
license.submit = Submeter
# Enteprise Spark Manager
client.features.title = Funcionalidades de Cliente
client.feature = Funcionalidades
client.features.spark.only = (Apenas Spark)
client.features.update.features = Permiss\u00f5es de funcionalidades do cliente foram atualizadas.
client.features.info = Utilize o formul\u00e1rio abaixo para habilitar ou desabilitar funcionalidades de cliente \
Notex: Algumas das restri\u00e7\u00f5es de cliente aplicam-se somente ao cliente Spark.
client.features.broadcasting = Transmitindo
client.features.broadcasting.description = Permitir transmiss\u00e3o de mensagens para um grupo espec\u00edfico ou lista completa.
client.features.enabled = Habilitado
client.features.disabled = Desabilitado
client.features.filetransfer = Transfer\u00eancia de Arquivo
client.features.filetransfer.description = Permitir envio de arquivos de um usu\u00e1rio para outro.
client.features.groupchat = Bate-Papo em Grupo
client.features.groupchat.description = Permite entrar em salas de bate-papo.
client.features.vcard = Avatar/VCard
client.features.vcard.description = Permitir usu\u00e1rios a alterar seus perfis e avatares.
client.features.save.settings = Salvar Ajustes
permitted.client.title = Clientes Permitidos
permitted.client.description = Utilize o formul\u00e1rio abaixo para restringir acesso do cliente.
permitted.client.success = Ajustes da vers\u00e3o do cliente foram atualizados.
permitted.client.legend = Clientes Habilitados a Conectarem-se
permitted.client.all.clients = Todos os Clientes
permitted.client.all.clients.description = Permitir todos os clientes XMPP a conectarem-se. Esse \u00e9 o ajuste \
recomendado a menos que voc\u00ea tenha necessidades espec\u00edficas de controle de cliente.
permitted.client.specific.clients = Especificar Cliente(s)
permitted.client.add.other.client = Adicionar Outro Cliente
permitted.client.save.settings = Salvar Ajustes
permitted.client.add = Adicionar
permitted.client.remove = Remover
permitted.client.tooltip = Especificar o nome do cliente retornado pela confer\u00eancia da Vers\u00e3o de Software. \
O nome especificado deve ser<br>parte da string retornada na chamada.
spark.version.title = Vers\u00e3o Spark
spark.version.instructions = Ajuste a vers\u00e3o espec\u00edfica do cliente Spark IM que usu\u00e1rios podem usar \
com seu sistema para cada sistema operacional. Se voc\u00ea disponibilizar uma nova vers\u00e3o, os usu\u00e1rios \
ser\u00e3o automaticamente avisados para atualizar.
spark.version.form.builds = Coloque as vers\u00f5es no diret\u00f3rio seguinte:
spark.version.form.upload = Upload de Cliente Spark:
spark.version.form.button = Upload Spark
spark.version.form.confirmation.build = Informa\u00e7\u00f5es de vers\u00e3o atualizada com sucesso.
spark.version.form.confirmation.upload = Upload de novo arquivo spark realizado com sucesso.
spark.version.form.clients.active = Ativo
spark.version.form.clients.name = Nome do Cliente
spark.version.form.clients.date = Data
spark.version.form.clients.nobuilds = Sem vers\u00f5es dispon\u00edveis
spark.version.form.clients.windows = Clientes Windows
spark.version.form.clients.mac = Clientes Mac
spark.version.form.clients.nix = Clientes Linux/Unix
spark.version.form.optional = Mensagem Opcional
spark.version.form.optional.instructions = Utilize a caixa de texto abaixo para especificar a mensagem que \
cada cliente ver\u00e1 durante o download de uma nova vers\u00e3o.
spark.version.form.update = Atualizar Vers\u00f5es de Spark
spark.download.title = Download do Spark
spark.download.instructions = Para efetuar o download do Spark diretamente do servidor, utilize os links seguintes:
spark.download.nobuild = Nenhuma vers\u00e3o dispon\u00edvel.
spark.download.windows = Windows:
spark.download.mac = Mac OSX:
spark.download.nix = Linux/Unix:
spark.download.emailtemplate = Modelo de Email
spark.download.emailtemplate.instructions = Voc\u00ea pode utilizar o texto seguinte como modelo para \
avisar usu\u00e1rios sobre onde efetuar o download do cliente Spark IM.
spark.download.emailtemplate.template.part1 = N\u00f3s distribu\u00edmos um novo sistema de mensagens instantâneas baseado \
no sevidor Openfire e no cliente Spark IM que tem uma seguran\u00e7a s\u00f3lida e bastantes funcionalidades. \
Para concluir a instala\u00e7\u00e3o, leva somente alguns minutos. Fa\u00e7a o download do instalador em:
spark.download.emailtemplate.template.part2 = Ap\u00f3s a instala\u00e7\u00e3o inicial, o cliente ir\u00e1 te avisar quando \
atualiza\u00e7\u00f5es estiverem dispon\u00edveis.
spark.download.emailtemplate.template.part3 = Quando o cliente inicia, insira o seu nome de usu\u00e1rio e senha junto com o\
nome do servidor {0}.
spark.download.emailtemplate.template.part4 = Por favor, contacte-me caso necessite seu nome de usu\u00e1rio e senha.
archive.settings.title = Ajustes de Arquivamento
archive.settings.success = Ajustes de Arquivamento foram salvos.
archive.settings.rebuild.success = Refazendo \u00edndices de Busca.
archive.settings.message.metadata.title = Ajustes de Mensagens e Metadata
archive.settings.message.metadata.description = Habilitar ou desabilitar arquivamento de mensagem e/ou metadata.
archive.settings.description = Utilize o formul\u00e1rio abaixo para gerenciar ajustes de arquivamento.
archive.settings.enable.metadata = Arquivamento de Estado de Conversa
archive.settings.enable.metadata.description = Gravar quem fala com quem, tempo de conversa, e o n\u00famero de \
mensagens em cada conversa. O conte\u00fado da mensagem n\u00e3o ser\u00e1 gravado a menos que arquivamento de mensagem \
esteja habilitado.
archive.settings.enable.message = Arquivamento de Mensagem
archive.settings.enable.message.description = Arquivar o texto completo de todas as mensagens enviadas entre usu\u00e1rios. \
Texto da mensagem ser\u00e1 pesquis\u00e1vel utilizando palavras chaves
archive.settings.idle.time = Tempo Ocioso
archive.settings.idle.time.description = N\u00famero de minutos que a conversa pode estar ociosa antes de ser encerrada.
archive.settings.max.time = Tempo M\u00e1ximo
archive.settings.max.time.description = N\u00famero m\u00e1ximo de minutos que a conversa pode durar antes de ser encerrada.
archive.settings.index.settings = Ajustes de \u00edndice
archive.settings.index.settings.description = Ver e/ou refazer o \u00edndice de Buscas atual.
archive.settings.current.index = \u00edndice de Buscas Atual
archive.settings.current.index.description = O tamanho atual do \u00edndice de mensagens.
archive.settings.message.count = N\u00famero de Mensagens Arquivadas
archive.settings.message.count.description = O n\u00famero total de mensagens arquivadas.
archive.settings.conversation.count = N\u00famero de Conversas Arquivadas
archive.settings.conversation.count.description = O n\u00famero total de conversas arquivadas.
archive.settings.update.settings = Ajustes de Atualiza\u00e7\u00e3o
archive.settings.cancel = Cancelar
archive.settings.rebuild = Refazer \u00edndice
archive.settings.any = Qualquer
archive.search.title = Arquivo de Buscas
archive.search.participants = Participante(s):
archive.search.participants.tooltip = Insira ou pesquise o nome do participante a ser pesquisado.\
Voc\u00ea tamb\u00e9m pode inserir um segundo participante para conversas mais espec\u00edficas.
archive.search.participants.any = Qualquer
archive.search.participants.browse = Listar
archive.search.daterange = Intervalo de Datas:
archive.search.daterange.tooltip = Insira intervalo de datas espec\u00edfico para pesquisa. Voc\u00ea pode especificar uma data \
de in\u00edcio e/ou uma data de fim
archive.search.daterange.start = In\u00edcio:
archive.search.daterange.end = Final:
archive.search.daterange.any = Qualquer
archive.search.daterange.format = Utilize mm/dd/aa
archive.search.daterange.error = A hora final deve ser ap\u00f3s a hora inicial
archive.search.keywords = Palavras-chave:
archive.search.keywords.optional = (opcional)
archive.search.keywords.disabled = Pesquisa por palavras-chave est\u00e1 desabilitada. Para habilitar pesquisa por \
palavras-chave, voc\u00ea deve habilitar arquivamento de mensagem em {0}Ajustes de Arquivamento{1}.
archive.search.pdf.title = Transcri\u00e7\u00e3o da Conversa
archive.search.pdf.participants = Participantes:
archive.search.pdf.startdate = Data de In\u00edcio:
archive.search.pdf.duration = Dura\u00e7\u00e3o:
archive.search.pdf.messagecount = N\u00famero de Mensagens:
archive.search.submit = Busca
archive.search.results = Resultados da Pesquisa:
archive.search.results.description = Sua pesquisa retornou {0} resultados. Selecione o resultado à esquerda para \
visualizar a conversa.
archive.search.results.xofy = de\
of
archive.search.results.participants = Participantes:
archive.search.results.messagecount = N\u00famero de Mensagens:
archive.search.results.date = Data:
archive.search.results.duration = Dura\u00e7\u00e3o:
archive.search.results.none = Nenhuma conversa foi encontrada utilizando os crit\u00e9rios de pesquisa especificados. \
Por favor, modifique os crit\u00e9rios de pesquisa e tente novamente.
archive.search.results.archive_disabled = As mensagens nesta conversa n\u00e3o foram arquivadas.
archive.conversations = Conversas ativas:
archive.conversations.users = Usu\u00e1rios
archive.conversations.duration = Dura\u00e7\u00e3o
archive.conversations.lastactivity = \u00daltima Atividade
archive.conversations.messages = Mensagens
archive.converations.no_conversations = Nenhuma conversa ativa.
stat.active_group_chats.name = Bate-Papo em Grupo: Salas
stat.active_group_chats.desc = O n\u00famero de salas de bate-papo que estiveram ativas ao longo do tempo
stat.active_group_chats.units = Salas de Bate-Papo
stat.server_sessions.name = Conex\u00f5es de Servidor para Servidor
stat.server_sessions.desc = N\u00famero de Conex\u00f5es de Servidor para Servidor.
stat.server_sessions.units = Conex\u00f5es S2S
stat.sessions.name = Conex\u00f5es de Cliente
stat.sessions.desc = N\u00famero de Clientes Conectados Diretamente ao Servidor.
stat.sessions.units = Conex\u00f5es de Cliente
stat.packet_count.name = N\u00famero de Pacotes
stat.packet_count.desc = N\u00famero de Pacotes Enviados e Recebidos pelo Openfire.
stat.packet_count.units = Pacotes por Minuto
stat.conversation.name = Conversas
stat.conversation.desc = Conversas entre usu\u00e1rios.
stat.conversation.units = Conversas
# Enterprise Bookmarks
users = Usu\u00e1rios
groups = Grupos
options = Op\u00e7\u00f5es
cancel = Cancelar
create = Criar
group.chat.bookmark.title = Marcadores de Salas de Bate-Papo
group.chat.bookmark.description = Criar marcadores para salas de bate-papo. Cada marcador pode ser atribu\u00eddo \
a indiv\u00edduos em particular ou a grupos (ou a todos usu\u00e1rios).
group.chat.bookmark.created = Marcador de sala de bate-papo criado com sucesso.
group.chat.bookmark.removed = Marcador de sala de bate-papo removido com sucesso.
group.chat.bookmark.name = Nome de Sala de Bate-Papo
group.chat.bookmark.address = Endere\u00e7o de Sala de Bate-Papo
group.chat.bookmark.autojoin = Auto-Ingressar
group.chat.bookmark.users = usu\u00e1rio(s)
group.chat.bookmark.groups = sala(s)
group.chat.bookmark.none = Atualmente, voc\u00ea n\u00e3o tem nenhum marcador de sala de bate-papo. clique em \
'adicionar marcador de sala de bate-papo' para adicionar nova sala de grupo de bate-papo.
group.chat.bookmark.add = Adicionar Marcador de Sala de Bate-Papo
bookmark.edit = Editar Marcador
bookmark.create = Criar Marcador
bookmark.created = Um novo marcador foi criado.
bookmark.url.name = Nome da URL
bookmark.url.name.description = ex. Nosso Website Interno
bookmark.url = URL
bookmark.url.manager.title = Gerenciador de Marcadores de URL
bookmark.url.manager.description = Permite a cria\u00e7\u00e3o de Marcadores de URL no cliente de IM dos usu\u00e1rios. Marcadores de URL permitem acesso r\u00e1pido para links utilizados com freqü\u00eancia, diretamente do cliente deles.
bookmark.url.success = Um marcador de URL foi criado com sucesso.
bookmark.url.deleted = Marcador de URL exclu\u00eddo com sucesso.
bookmark.url.users = Usu\u00e1rios
bookmark.url.groups = Grupos
bookmark.url.rss = RSS
bookmark.url.options = Op\u00e7\u00f5es
bookmark.url.no.bookmarks = Atualmente, voc\u00ea n\u00e3o tem nenhum Marcador de URL. Clique em 'Adicionar Marcador de URL' para incluir um.
bookmark.url.add = Adicionar Marcador de URL
bookmark.create.rss.feed = RSS Feed:
bookmark.create.all.users = Todos usu\u00e1rios
bookmark.url.error = Por favor, especifique uma URL a ser utilizada.
bookmark.browse.users = Listar Usu\u00e1rios
bookmark.browse.groups = Listar Grupos
bookmark.users.groups.error = Voc\u00ea deve especificar usu\u00e1rios e/ou grupos para criar um marcador v\u00e1lido.
bookmark.save.changes = Salvar Altera\u00e7\u00f5es
bookmark.urlName.error = Por favor, especifique o nome da URL.
bookmark.groupchat.name.error = Por favor, especifique o nome da sala de bate-papo.
bookmark.groupchat.address.error = Por favor, especifique um endere\u00e7o v\u00e1lido da sala de bate-papo.
bookmark.url.create.description = Crie um novo marcador de URL utilizando o formul\u00e1rio abaixo.
bookmark.groupchat.create.description = Crie uma nova sala de bate-papo utilizando o formul\u00e1rio abaixo.
bookmark.url.edit.description = Edite marcador de URL utilizando o formul\u00e1rio abaixo.
bookmark.groupchat.edit.description = Edite marcador de sala de bate-papo utilizando o formul\u00e1rio abaixo.
bookmark.delete.confirm = Excluir Este Marcador?
bookmark.delete.confirm.prompt = Voc\u00ea tem certeza que deseja excluir este Marcador?
bookmark.delete.url.urlname = Nome da URL:
bookmark.delete.url.url = URL:
bookmark.delete.url.users = Usu\u00e1rios:
bookmark.delete.url.groups = Grupos:
bookmark.delete.url.submit = Apagar
bookmark.delete.url.cancel = Cancelar
bookmark.delete.chat.groupname = Nome da Sala de Bate-Papo:
bookmark.delete.chat.address = Endere\u00e7o da Sala de Bate-Papo:
bookmark.delete.chat.users = Usu\u00e1rios:
bookmark.delete.chat.groups = Grupos:
bookmark.delete.chat.autojoin = Auto-Ingressar:
bookmark.delete.chat.submit = Apagar
bookmark.delete.chat.cancel = Cancelar
# Dashboard
dashboard.title = Painel do Openfire
dashboard.description = Um resumo da atividade atual do Openfire.
dashboard.directions = Clique nos gr\u00e1ficos para ampli\u00e1-los.
dashboard.snapshot.enlarge = Aumentar Gr\u00e1fico
dashboard.snapshot.shrink = Diminuir Gr\u00e1fico
dashboard.timespan = Intervalo:
dashboard.timespan.lasthour = 1 Hora
dashboard.timespan.last24hours = 24 Horas
dashboard.timespan.last7days = 7 Dias
dashboard.spotlights.high = Alto:
dashboard.spotlights.low = Baixo:
dashboard.spotlights.packetactivity = Pacotes por Minuto
dashboard.spotlights.activeconversations = Conversas Ativas
dashboard.spotlights.currentusers = Usu\u00e1rios Atuais
dashboard.quickstats = Status R\u00e1pidos
dashboard.quickstats.high = Alto
dashboard.quickstats.low = Baixo
dashboard.currentconversations = Conversas Atuais
dashboard.currentconversations.details = Ver detalhes
dashboard.currentconversations.users = Usu\u00e1rios
dashboard.currentconversations.lastactivity = \u00daltima Atividade
dashboard.currentconversations.messagecount = Mensagens
dashboard.currentconversations.none = Nenhuma conversa ativa.
# All Reports
allreports.title = Todos os Relat\u00f3rios
allreports.daterange = Intervalo de datas
allreports.daterange.preset = Pr\u00e9-ajustado
allreports.daterange.preset.last60minutes = \u00faltimos 60 minutos
allreports.daterange.preset.last24hours = \u00daltimas 24 horas
allreports.daterange.preset.thisweek = Esta Semana
allreports.daterange.preset.last7days = \u00daltimos 7 dias
allreports.daterange.preset.lastweek = \u00daltima semana
allreports.daterange.preset.thismonth = Este m\u00eas
allreports.daterange.preset.lastmonth = \u00daltimo m\u00eas
allreports.daterange.preset.last3months = \u00daltimos 3 meses
allreports.daterange.specific = Espec\u00edfico
allreports.daterange.specific.startdate = In\u00edcio:
allreports.daterange.specific.enddate = Fim:
allreports.daterange.startdate.error = Por favor, insira uma data de in\u00edcio no formato mm/dd/aa.
allreports.daterange.enddate.error = Por favor, insira uma data de fim antes de amanh\u00e3 no formato mm/dd/aa.
allreports.selectreport = Selecionar Relat\u00f3rio
allreports.download.allreports = Fazer Download de Todos Relat\u00f3rios
allreports.download.allreports.pdf = PDF
allreports.download.allreports.pdf.format = Formato PDF
allreports.download.singlereport = Fazer download deste relat\u00f3rio:
allreports.download.singlereport.pdf = PDF
allreports.reportinformation = Informa\u00e7\u00f5es do Relat\u00f3rios
global.pages=P\u00e1ginas
global.showing=Mostrando
permitted.client.website=
test = Test
\ No newline at end of file
# $RCSfile$
# $Revision: 3148 $
# $Date: 2005-12-01 14:50:45 -0300 (Thu, 01 Dec 2005) $
##
## Enterprise Resource Bundle
##
## Additional locales can be specified by creating a new resource file in this
## directory using the following conventions:
##
## enterprise_i18n "_" language "_" country ".properties"
## enterprise_i18n "_" language ".properties"
##
## e.g.
## enterprise_i18n_en.propertis <- English resources
## enterprise_i18n_en_US.properties <- American US resources
## enterprise_i18n_de.properties <- German resources
## enterprise_i18n_ja.properties <- Japanese resources
##
## Please note that the two digit language code should be lower case, and the
## two digit country code should be in uppercase. Often, it is not necessary to
## specify the country code.
##
## A full list of language codes can be found at
## http://www-old.ics.uci.edu/pub/ietf/http/related/iso639.txt
## and a full list of country codes can be found at
## http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html
##
## In property strings that are parameterized, single quotes can be used to
## quote the "{" (curly brace) if necessary. A real single quote is represented by ''.
##
## REVISION HISTORY (by Enterprise version):
##
## 3.0.0
## Initial Release
# Enterprise
login.title = \u7ba1\u7406\u63a7\u5236\u53f0
error.exception = \u5f02\u5e38:
plugin.name=Openfire\u4f01\u4e1a\u7248
plugin.description=Openfire\u4f01\u4e1a\u7248
admin.tab.enterprise.name=\u4f01\u4e1a\u7248
admin.tab.enterprise.description=Openfire\u4f01\u4e1a\u7248
admin.sidebar.statistics.name=\u7edf\u8ba1\u8868
admin.sidebar.statistics.description=Openfire\u4f01\u4e1a\u7248\u7edf\u8ba1\u8868
admin.item.stats-dashboard.name=\u4eea\u8868\u76d8
admin.item.stats-dashboard.description=\u6d4f\u89c8\u6574\u4e2a\u670d\u52a1\u5668\u7684\u7edf\u8ba1\u8868
admin.item.stats-reporter.name=\u6240\u6709\u7684\u62a5\u8868
admin.item.stats-reporter.description=\u67e5\u770b\u7edf\u8ba1\u8868\u7684\u62a5\u8868\u660e\u7ec6\u4fe1\u606f
admin.sidebar.archiving.name=\u6863\u6848\u6587\u4ef6
admin.sidebar.archiving.description=Openfire\u4f01\u4e1a\u7248\u5b58\u6863\u8bbe\u7f6e
admin.item.archive-search.name=\u641c\u7d22\u5b58\u6863\u6587\u4ef6
admin.item.archive-search.description=\u5355\u51fb\u641c\u7d22\u5b58\u6863\u6587\u4ef6
admin.item.archive-settings.name=\u5b58\u6863\u8bbe\u7f6e
admin.item.archive-settings.description=\u5355\u51fb\u8bbe\u7f6e\u5b58\u6863\u6587\u4ef6
admin.item.active-conversations.name=\u4f1a\u8bdd
admin.item.active-conversations.description=\u5355\u51fb\u67e5\u770b\u6d3b\u52a8\u7684\u5bf9\u8bdd
admin.sidebar.client.name=\u5ba2\u6237\u7aef\u7ba1\u7406Client Management
admin.sidebar.client.description=\u7ba1\u7406\u5ba2\u6237\u7aef\u7279\u6b8a\u548cSpark\u914d\u7f6e
admin.item.client-features.name=\u5ba2\u6237\u7aef\u7279\u6027
admin.item.client-features.description=\u5355\u51fb\u4f7f\u7528\u6216\u7981\u7528\u5ba2\u6237\u7aef\u7279\u6027
admin.item.client-version.name=\u5141\u8bb8\u7684\u5ba2\u6237\u7aef
admin.item.client-version.description=\u5355\u51fb\u8bbe\u7f6e\u5ba2\u6237\u7aef\u5e94\u7528\u53ef\u4ee5\u8054\u63a5\u5230\u4f60\u7684\u670d\u52a1\u5668
admin.item.groupchat-bookmarks.name=\u5206\u7ec4\u804a\u5929\u4e66\u7b7e
admin.item.groupchat-bookmarks.description=\u5355\u51fb\u7ba1\u7406\u7528\u6237\u7684\u5206\u7ec4\u804a\u5929\u4e66\u7b7e
admin.item.url-bookmarks.name=URL\u4e66\u7b7e
admin.item.url-bookmarks.description=\u5355\u51fb\u7ba1\u7406\u7528\u6237URL\u4e66\u7b7e
admin.item.spark-version.name=Spark\u7248\u672c
admin.item.spark-version.description=\u5355\u51fb\u4e3a\u6bcf\u4e2a\u5e73\u53f0\u8bbe\u7f6eSpark\u5ba2\u6237\u7aef\u7248\u672c
admin.item.spark-download.name=\u4e0b\u8f7dSpark
admin.item.spark-download.description=\u4e0b\u8f7dSpark.
admin.sidebar.general.name=\u5e38\u89c4\u8bbe\u7f6e
admin.sidebar.general.description=Openfire\u4f01\u4e1a\u7248\u5e38\u89c4\u8bbe\u7f6e
admin.item.license.name=\u7248\u6743\u4fe1\u606f
admin.item.license.description=\u5355\u51fb\u6d4f\u89c8\u7248\u6743\u4fe1\u606f
license.eval.header = \u5269\u4e0b\u7684\u8bd5\u7528\u8bc4\u4f30\u5929\u6570: {0}
license.eval.body = \u60a8\u7684Openfire\u4f01\u4e1a\u8bd5\u7528\u7248\u8fd8\u6709{0} \u5929\u8fc7\u671f. \u8054\u7cfb\u6211\u4eec\u7684 {1}\u8425\u4e1a\u90e8\u95e8 {2} \u8d2d\u4e70\u4f7f\u7528\u8bb8\u53ef\u8bc1\u3002
license.expiration.header = Days Until License Expires: {0}
license.expiration.body = Your Openfire Enterprise license will expire in {0} day(s). Please \
contact our {1}sales team{2} to purchase a new license.
license.maintenance.header = Days Until Maintenance Expires: {0}
license.maintenance.body = Your Openfire Enterprise maintenance will expire in {0} day(s). Please \
contact our {1}sales team{2} to purchase a new license.
license.eval.mini.multi_day = {0} \u5929
license.eval.mini.single_day = 1 \u5929
license.shrink = \u6536\u7f29
license.expand = \u5c55\u5f00
license.title = \u8bb8\u53ef\u8bc1\u4fe1\u606f
license.error = \u8bb8\u53ef\u8bc1\u9519\u8bef
license.error.no_license = No License Found
license.error.parse_error = \u8bb8\u53ef\u8bc1\u6587\u672c\u5e76\u4e0d\u80fd\u88ab\u5206\u6790\u3002\u8bf7\u8f93\u5165\u4e00\u4e2a\u5b8c\u6574\u7684\u8bb8\u53ef\u8bc1
license.error.expired = \u8bb8\u53ef\u8bc1\u8fc7\u671f\uff0c\u8bf7\u8f93\u5165\u4e00\u4e2a\u6700\u65b0\u7684\u8bb8\u53ef\u8bc1
license.error.invalid = \u8bb8\u53ef\u8bc1\u6587\u4ef6\u65e0\u6548\u6216\u9519\u8bef\uff0c\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u8bb8\u53ef\u8bc1
license.error.default = \u5728\u786e\u8ba4\u8bb8\u53ef\u8bc1\u6587\u4ef6\u7684\u65f6\u5019\u53d1\u751f\u9519\u8bef\uff0c\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u8bb8\u53ef\u8bc1
license.error.not_found = \u6ca1\u6709\u8bb8\u53ef\u8bc1\u6587\u4ef6\u88ab\u53d1\u73b0\uff0c\u8bf7\u5728\u4e0b\u9762\u8f93\u5165\u4e00\u4e2a\u8bb8\u53ef\u8bc1\u6587\u4ef6\u3002\u5982\u679c\u4f60\u6ca1\u6709\u8bb8\u53ef\u8bc1\u6587\u4ef6\uff0c\u4f60\u53ef\u4ee5\u6ce8\u518c\u4e00\u4e2a\u4e09\u5341\u5929\u7684\u8bc4\u4f30\u7248\u8bb8\u53ef\u8bc1\u5728<a href="http://www.jivesoftware.com/products/openfire/eval_landing.jsp" target="_blank">jivesoftware.com</a>
license.error.too_many_users = \u4f60\u5df2\u7ecf\u8d85\u8fc7\u4e86\u4f60\u7684\u8bb8\u53ef\u8bc1\u5141\u8bb8\u7684\u6700\u5927\u7528\u6237\u6570\uff0c\u65b0\u7684\u7528\u6237\u65e0\u6cd5\u8fde\u63a5\u6216\u8f93\u5165\u4e00\u4e2a\u65b0\u7684\u8bb8\u53ef\u8bc1\u6587\u4ef6\u3002
license.updated = \u8bb8\u53ef\u8bc1\u66f4\u65b0\u6210\u529f
license.details = Openfire\u4f01\u4e1a\u7248\u8bb8\u53ef\u8bc1\u8be6\u7ec6\u8d44\u6599
license.display.type = \u8bb8\u53ef\u8bc1\u7c7b\u578b
license.display.expires = \u8bb8\u53ef\u8bc1\u8fc7\u671f
license.display.created = \u8bb8\u53ef\u8bc1\u521b\u5efa
license.display.max_users = \u6700\u5927\u7528\u6237\u6570
license.display.no_expires_date = \u6c38\u8fdc\u6709\u6548
license.display.no_creation_date = \u672a\u77e5
license.new_license.title = \u8f93\u5165\u8bb8\u53ef\u8bc1
license.new_license.description = \u8f93\u5165\u4f60\u7684\u8bb8\u53ef\u8bc1\uff0c\u590d\u5236\u60a8\u7684\u4f01\u4e1a\u8bb8\u53ef\u8bc1\u6587\u4ef6\u8fdb\u5165\u4e0b\u9762\u7684\u533a\u57df\u4e2d\u3002
license.update_license.update = \u66f4\u65b0\u8bb8\u53ef\u8bc1
license.update_license.cancel = \u53d6\u6d88
license.update_license.title = \u66f4\u65b0\u8bb8\u53ef\u8bc1
license.update_license.description = \u590d\u5236\u60a8\u7684\u4f01\u4e1a\u8bb8\u53ef\u8bc1\u6587\u4ef6\u5230\u4e0b\u9762\u7684\u533a\u57df\u4e2d\u3002
license.alt = \u4f5c\u4e3a\u4e00\u79cd\u9009\u62e9\uff0c\u60a8\u53ef\u4ee5\u590d\u5236\u4f01\u4e1a\u8bb8\u53ef\u8bc1\u5230\u4e0b\u9762\u7684\u4f4d\u7f6e\uff08\u53ef\u80fd\u9700\u8981\u91cd\u65b0\u542f\u52a8\u670d\u52a1\u5668\u4f7f\u8bbe\u7f6e\u751f\u6548\uff09
license.submit = \u63d0\u4ea4
# Enteprise Spark Manager
client.features.title = \u5ba2\u6237\u7aef\u7279\u6027
client.feature = \u7279\u6027
client.features.spark.only = (\u4ec5\u7528\u4e8eSpark)
client.features.update.features = \u5ba2\u6237\u7aef\u7279\u6027\u5141\u8bb8\u88ab\u66f4\u65b0
client.features.info = \u4f7f\u7528\u4e0b\u8868\u5141\u8bb8\u6216\u7981\u6b62\u4f7f\u7528\u5ba2\u6237\u7aef\u7aef\u7279\u6027\u3002 \u6ce8\u610f\uff1a\u90e8\u5206\u5ba2\u6237\u7aef\u9650\u5236\u4e86\u5bf9Spark\u5ba2\u6237\u7aef\u7684\u652f\u6301\u3002
client.features.broadcasting = \u5e7f\u64ad
client.features.broadcasting.description = \u5141\u8bb8\u5e7f\u64ad\u4fe1\u606f\u7ed9\u6307\u5b9a\u7684\u7ec4\u6216\u5168\u90e8\u7684\u597d\u53cb\u5217\u8868
client.features.enabled = \u6b63\u5e38
client.features.disabled = \u7981\u6b62
client.features.filetransfer = \u6587\u4ef6\u4f20\u9001
client.features.filetransfer.description = \u5141\u8bb8\u5728\u7528\u6237\u4e4b\u95f4\u4f20\u9001\u6587\u4ef6
client.features.groupchat = \u5206\u7ec4\u5bf9\u8bdd
client.features.groupchat.description = \u5141\u8bb8\u52a0\u5165\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4
client.features.vcard = \u4e2a\u4eba\u5f62\u8c61
client.features.vcard.description = \u5141\u8bb8\u7528\u6237\u6539\u53d8\u81ea\u5df1\u7684\u4e2a\u4eba\u5f62\u8c61
client.features.save.settings = \u4fdd\u5b58\u8bbe\u7f6e
permitted.client.title = \u88ab\u51c6\u8bb8\u7684\u5ba2\u6237\u7aef
permitted.client.description = \u4f7f\u7528\u4e0b\u9762\u7684\u8868\u5355\u9650\u5236\u5ba2\u6237\u7aef\u7684\u8fdb\u5165
permitted.client.success = \u5ba2\u6237\u7aef\u7248\u672c\u8bbe\u7f6e\u66f4\u65b0
permitted.client.legend = \u5ba2\u6237\u7aef\u5141\u8bb8\u8fde\u63a5
permitted.client.all.clients = \u6240\u6709\u7684\u5ba2\u6237\u7aef
permitted.client.all.clients.description = \u5141\u8bb8\u6240\u6709\u7684XMPP\u5ba2\u6237\u7aef\u8fde\u63a5\u3002\u8fd9\u662f\u63a8\u8350\u8bbe\u7f6e\uff0c\u9664\u975e\u4f60\u6709\u9650\u5236\u5ba2\u6237\u7aef\u7684\u9700\u6c42
permitted.client.specific.clients = \u6307\u5b9a\u5ba2\u6237\u7aef
permitted.client.add.other.client = \u589e\u52a0\u5176\u5b83\u5ba2\u6237\u7aef
permitted.client.save.settings = \u4fdd\u5b58\u8bbe\u7f6e
permitted.client.add = \u589e\u52a0
permitted.client.remove = \u5220\u9664
permitted.client.tooltip = \u8f6f\u4ef6\u7248\u672c\u68c0\u5bdf\u8fd4\u56de\u6307\u5b9a\u7684\u5ba2\u6237\u7aef\u540d\u79f0\u3002\u60a8\u6307\u5b9a\u7684\u540d\u79f0\u5fc5\u987b\u662f\u5728\u8fd4\u56de\u68c0\u5bdf\u4e2d\u6240\u63d0\u53d6\u7684\u5b57\u7b26
permitted.client.website=website
spark.version.title = Spark\u7248\u672c
spark.version.instructions = \u8bbe\u7f6e\u6307\u5b9a\u7248\u672c\u7684Spark\u5373\u65f6\u901a\u4fe1\u5ba2\u6237\u7aef\u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u4efb\u4f55\u64cd\u4f5c\u7cfb\u7edf\u4f7f\u7528\u4f60\u7684\u7cfb\u7edf\u3002\u5982\u679c\u4f60\u914d\u7f6e\u4e86\u4e00\u4e2a\u65b0\u7248\u672c\uff0c\u7528\u6237\u5c06\u81ea\u52a8\u6536\u5230\u5347\u7ea7\u63d0\u793a\u3002
spark.version.form.builds = \u5b89\u88c5\u5730\u70b9\u5728\u4e0b\u9762\u7684\u76ee\u5f55:
spark.version.form.upload = \u4e0a\u4f20Spark\u5ba2\u6237\u7aef:
spark.version.form.button = \u4e0a\u4f20Spark
spark.version.form.confirmation.build = \u5b89\u88c5\u4fe1\u606f\u66f4\u65b0\u6210\u529f
spark.version.form.confirmation.upload = \u65b0\u7684Spark\u6587\u4ef6\u4e0a\u4f20
spark.version.form.clients.active = \u6d3b\u52a8
spark.version.form.clients.name = \u5ba2\u6237\u7aef\u540d\u5b57
spark.version.form.clients.date = \u65e5\u671f
spark.version.form.clients.nobuilds = \u65e0\u6709\u6548\u7684\u5b89\u88c5
spark.version.form.clients.windows = Windows\u5ba2\u6237\u7aef
spark.version.form.clients.mac = Mac\u5ba2\u6237\u7aef
spark.version.form.clients.nix = Linux/Unix\u5ba2\u6237\u7aef
spark.version.form.optional = \u53ef\u9009\u4fe1\u606f
spark.version.form.optional.instructions = \u4f7f\u7528\u4e0b\u9762\u7684\u6587\u672c\u533a\u6307\u5b9a\u4e00\u6761\u4fe1\u606f\uff0c\u5f53\u4e0b\u8f7d\u4e00\u4e2a\u65b0\u7684\u5b89\u88c5\u7a0b\u5e8f\u65f6\u7528\u6237\u5c06\u770b\u5230\u672c\u6761\u4fe1\u606f
spark.version.form.update = \u66f4\u65b0Spark\u7248\u672c
spark.download.title = Spark\u4e0b\u8f7d
spark.download.instructions = \u76f4\u63a5\u4e0b\u8f7dSpark,\u4f7f\u7528\u4e0b\u9762\u7684\u94fe\u63a5:
spark.download.nobuild = \u65e0\u6709\u6548\u7684\u5b89\u88c5\u7a0b\u5e8f
spark.download.windows = Windows:
spark.download.mac = Mac OSX:
spark.download.nix = Linux/Unix:
spark.download.emailtemplate = Email\u6a21\u677f
spark.download.emailtemplate.instructions = \u60a8\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u7684\u6587\u672c\u505a\u4e3a\u4e00\u4e2a\u6a21\u677f\uff0c\u63d0\u793a\u7528\u6237\u5728\u4ec0\u4e48\u5730\u65b9\u4e0b\u8f7dSpark\u5ba2\u6237\u7aef.
spark.download.emailtemplate.template.part1 = \u6211\u4eec\u57fa\u4e8eOpenfire\u670d\u52a1\u5668\u548cSpark\u5373\u65f6\u901a\u4fe1\u5ba2\u6237\u7aef\u90e8\u7f72\u4e86\u4e00\u4e2a\u65b0\u7684\u5373\u65f6\u901a\u4fe1\u7cfb\u7edf\u3002\u672c\u7cfb\u7edf\u6709\u66f4\u5f3a\u7684\u5b89\u5168\u6027\u548c\u8bb8\u591a\u5176\u5b83\u7279\u5f81\u3002\u8bbe\u7f6e\u548c\u8fd0\u884c\u4ec5\u987b\u8981\u51e0\u5206\u949f\u65f6\u95f4\uff0c\u4ece\u8fd9\u91cc\u4e0b\u8f7d\u5b89\u88c5\u7a0b\u5e8f\uff1a
spark.download.emailtemplate.template.part2 = \u5f53\u4f60\u5b8c\u6210\u521d\u4f7f\u5b89\u88c5\u540e\uff0c\u5982\u679c\u6709\u66f4\u65b0\u7684\u7248\u672c\u65f6\uff0c\u5ba2\u6237\u7aef\u5c06\u81ea\u52a8\u5bf9\u60a8\u8fdb\u884c\u63d0\u793a\u3002
spark.download.emailtemplate.template.part3 = \u5f53\u5ba2\u6237\u7aef\u8fd0\u884c\u540e\uff0c\u8bf7\u8fde\u540c\u670d\u52a1\u5668\u540d {0} \u4e00\u8d77\u8f93\u5165\u60a8\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801
spark.download.emailtemplate.template.part4 = \u9700\u8981\u7528\u6237\u540d\u8ddf\u5bc6\u7801\u8bf7\u8054\u7cfb\u6211\u4eec
archive.settings.title = \u5b58\u6863\u8bbe\u7f6e
archive.settings.success = \u5b58\u6863\u8bbe\u7f6e\u4fdd\u5b58\u6210\u529f
archive.settings.rebuild.success = \u641c\u7d22\u7d22\u5f15\u91cd\u5efa
archive.settings.message.metadata.title = \u4fe1\u606f\u548c\u5143\u6570\u636e\u8bbe\u7f6e
archive.settings.message.metadata.description = \u542f\u7528\u6216\u7981\u7528\u4fe1\u606f\u548c\u5143\u6570\u636e\u5b58\u6863
archive.settings.description = \u4f7f\u7528\u4e0b\u9762\u7684\u8868\u5355\u7528\u4e8e\u7ba1\u7406\u5b58\u6863\u8bbe\u7f6e
archive.settings.enable.metadata = \u4f1a\u8bdd\u72b6\u6001\u5b58\u6863
archive.settings.enable.metadata.description = \u8bb0\u5f55\u67d0\u4e24\u4eba\u4e4b\u95f4\u7684\u4f1a\u8bdd\uff0c\u6bcf\u6b21\u4f1a\u8bdd\u7684\u4fe1\u606f\u6570\u548c\u4f1a\u8bdd\u6301\u7eed\u65f6\u95f4\u3002\u5f53\u4fe1\u606f\u5b58\u6863\u542f\u7528\u65f6\u5b9e\u9645\u7684\u4fe1\u606f\u5185\u5bb9\u5c06\u88ab\u8bb0\u5f55\u3002
archive.settings.enable.message = \u4fe1\u606f\u5b58\u6863
archive.settings.enable.message.description = \u5728\u7528\u6237\u4e4b\u95f4\u7684\u4f20\u9001\u7684\u6240\u6709\u4fe1\u606f\u5b58\u6863\u6587\u672c\u53ef\u4ee5\u4f7f\u7528\u5173\u952e\u8bcd\u65b9\u5f0f\u67e5\u627e\u3002
archive.settings.idle.time = \u7a7a\u95f2\u65f6\u95f4
archive.settings.idle.time.description = \u4f1a\u8bdd\u7ed3\u675f\u540e\u7a7a\u95f2\u7684\u65f6\u95f4
archive.settings.max.time = \u6700\u5927\u65f6\u95f4
archive.settings.max.time.description = \u4f1a\u8bdd\u7ed3\u675f\u524d\u53ef\u6301\u7eed\u7684\u6700\u5927\u65f6\u95f4
archive.settings.index.settings = \u7d22\u5f15\u8bbe\u7f6e
archive.settings.index.settings.description = \u67e5\u770b\u6216\u91cd\u5efa\u5f53\u524d\u7684\u641c\u7d22\u7d22\u5f15
archive.settings.current.index = \u5f53\u524d\u7684\u641c\u7d22\u7d22\u5f15
archive.settings.current.index.description = \u5f53\u524d\u7684\u4fe1\u606f\u7d22\u5f15\u5927\u5c0f
archive.settings.message.count = \u5b58\u6863\u4fe1\u606f\u6570\u91cf
archive.settings.message.count.description = \u5b58\u6863\u4fe1\u606f\u603b\u6570
archive.settings.conversation.count = \u5b58\u6863\u5bf9\u8bdd\u6570\u91cf
archive.settings.conversation.count.description = \u5b58\u6863\u5bf9\u8bdd\u603b\u6570
archive.settings.update.settings = \u66f4\u65b0\u8bbe\u7f6e
archive.settings.cancel = \u53d6\u6d88
archive.settings.rebuild = \u91cd\u5efa\u7d22\u5f15
archive.settings.any = \u4efb\u4f55\u4e00\u9879
archive.search.title = \u641c\u7d22\u5b58\u6863
archive.search.participants = \u53c2\u4e0e\u8005:
archive.search.participants.tooltip = \u8f93\u5165\u6216\u6d4f\u89c8\u53c2\u4e0e\u8005\u540d\u5b57\u7528\u4e8e\u641c\u7d22\u3002\u60a8\u4e5f\u53ef\u4ee5\u8f93\u5165\u7b2c\u4e8c\u4e2a\u53c2\u4e0e\u8005\u7528\u4e8e\u641c\u7d22\u66f4\u591a\u7684\u5bf9\u8bdd\u4fe1\u606f
archive.search.participants.any = \u4efb\u4f55\u4e00\u9879
archive.search.participants.browse = \u6d4f\u89c8
archive.search.daterange = \u65f6\u95f4\u8303\u56f4:
archive.search.daterange.tooltip = \u8f93\u5165\u4e00\u4e2a\u6307\u5b9a\u7684\u65e5\u671f\u7528\u4e8e\u641c\u7d22\u3002\u60a8\u53ef\u4ee5\u6307\u5b9a\u4e00\u4e2a\u5f00\u59cb\u65f6\u95f4\u6216\u7ed3\u675f\u65f6\u95f4\u3002
archive.search.daterange.start = \u5f00\u59cb:
archive.search.daterange.end = \u7ed3\u675f:
archive.search.daterange.any = \u4efb\u4f55\u4e00\u9879
archive.search.daterange.format = \u4f7f\u7528 mm/dd/yy
archive.search.daterange.error = \u7ed3\u675f\u65f6\u95f4\u5fc5\u987b\u5728\u5f00\u59cb\u65f6\u95f4\u4e4b\u540e\u3002
archive.search.keywords = \u5173\u952e\u5b57:
archive.search.keywords.optional = (\u53ef\u9009\u9879)
archive.search.keywords.disabled = \u5173\u952e\u5b57\u641c\u7d22\u7981\u7528\u3002\u8981\u5f00\u542f\u5173\u952e\u5b57\u641c\u7d22\uff0c\u4f60\u5fc5\u987b\u5f00\u542f\u5728{0}\u5b58\u6863\u8bbe\u7f6e\u4e2d\u7684\u4fe1\u606f\u5b58\u6863{1}
archive.search.pdf.title = \u5bf9\u8bdd\u590d\u5236\u6587\u672c
archive.search.pdf.participants = \u53c2\u4e0e\u8005:
archive.search.pdf.startdate = \u5f00\u59cb\u65f6\u95f4:
archive.search.pdf.duration = \u6301\u7eed\u65f6\u95f4:
archive.search.pdf.messagecount = \u4fe1\u606f\u5408\u8ba1:
archive.search.submit = \u641c\u7d22
archive.search.results = \u641c\u7d22\u7ed3\u679c:
archive.search.results.description = \u60a8\u7684\u641c\u7d22\u8fd4\u56de {0} \u7ed3\u679c. \u5728\u5de6\u8fb9\u9009\u62e9\u4e00\u4e2a\u7ed3\u679c\u67e5\u770b\u5bf9\u8bdd
archive.search.results.xofy = \u5bf9\u4e8e
archive.search.results.participants = \u53c2\u4e0e\u8005:
archive.search.results.messagecount = \u4fe1\u606f\u6570\u91cf:
archive.search.results.date = \u65e5\u671f:
archive.search.results.duration = \u6301\u7eed\u65f6\u95f4:
archive.search.results.none = \u6307\u5b9a\u7684\u641c\u7d22\u6807\u51c6\u4e2d\u6ca1\u6709\u627e\u5230\u76f8\u5173\u7684\u4f1a\u8bdd\u4fe1\u606f\u3002\u8bf7\u6539\u53d8\u60a8\u7684\u641c\u7d22\u6807\u51c6\u518d\u8bd5\u4e00\u6b21\u3002
archive.search.results.archive_disabled = \u672c\u6b21\u5bf9\u8bdd\u4fe1\u606f\u5e76\u6ca1\u6709\u5b58\u6863\u3002
archive.conversations = \u6d3b\u8dc3\u7684\u5bf9\u8bdd:
archive.conversations.users = \u7528\u6237
archive.conversations.duration = \u6301\u7eed\u65f6\u95f4
archive.conversations.lastactivity = \u6700\u8fd1\u7684\u6d3b\u52a8
archive.conversations.messages = \u4fe1\u606f
archive.converations.no_conversations = \u975e\u6d3b\u8dc3\u7684\u5bf9\u8bdd
stat.active_group_chats.name = \u5206\u7ec4\u5bf9\u8bdd: \u623f\u95f4
stat.active_group_chats.desc = \u6309\u65f6\u95f4\u6d3b\u8dc3\u7684\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4\u6570
stat.active_group_chats.units = \u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4
stat.server_sessions.name = \u670d\u52a1\u5668\u4e0e\u670d\u52a1\u5668\u7684\u8fde\u63a5
stat.server_sessions.desc = \u670d\u52a1\u5668\u4e0e\u670d\u52a1\u5668\u7684\u8fde\u63a5\u6570
stat.server_sessions.units = S2S\u8fde\u63a5
stat.sessions.name = \u5ba2\u6237\u7aef\u8fde\u63a5
stat.sessions.desc = \u5ba2\u6237\u7aef\u76f4\u63a5\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u7684\u6570\u91cf
stat.sessions.units = \u5ba2\u6237\u7aef\u8fde\u63a5
stat.packet_count.name = \u6570\u636e\u5305\u6570\u91cf
stat.packet_count.desc = Openfire\u4f20\u9012\u548c\u63a5\u6536\u7684\u6570\u636e\u5305\u6570\u91cf
stat.packet_count.units = \u6bcf\u5206\u949f\u6570\u636e\u5305
stat.conversation.name = \u5bf9\u8bdd
stat.conversation.desc = \u7528\u6237\u95f4\u7684\u5bf9\u8bdd
stat.conversation.units = \u5bf9\u8bdd
# Enterprise Bookmarks
users = \u7528\u6237
groups = \u7ec4
options = \u9009\u9879
cancel = \u53d6\u6d88
create = \u5efa\u7acb
group.chat.bookmark.title = \u7ec4\u5bf9\u8bdd\u4e66\u7b7e
group.chat.bookmark.description = \u5efa\u7acb\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4\u4e66\u7b7e\u3002\u6bcf\u4e2a\u4e66\u7b7e\u53ef\u4ee5\u5206\u914d\u7ed9\u7279\u522b\u7684\u4e2a\u4eba\u6216\u7ec4\uff08\u6216\u6240\u6709\u7684\u7528\u6237\uff09
group.chat.bookmark.created = \u5206\u7ec4\u5bf9\u8bdd\u4e66\u7b7e\u88ab\u5efa\u7acb
group.chat.bookmark.removed = \u5206\u7ec4\u5bf9\u8bdd\u4e66\u7b7e\u88ab\u5220\u9664
group.chat.bookmark.name = \u5206\u7ec4\u5bf9\u8bdd\u540d\u5b57
group.chat.bookmark.address = \u5206\u7ec4\u5bf9\u8bdd\u5730\u5740
group.chat.bookmark.autojoin = \u81ea\u52a8\u52a0\u5165
group.chat.bookmark.users = \u7528\u6237
group.chat.bookmark.groups = \u7ec4
group.chat.bookmark.none = \u60a8\u73b0\u5728\u6ca1\u6709\u4efb\u4f55\u5206\u7ec4\u5bf9\u8bdd\u4e66\u7b7e\u3002\u5355\u51fb\u201c\u589e\u52a0\u5206\u7ec4\u5bf9\u8bdd\u4e66\u7b7e\u201d\u7528\u4e8e\u589e\u52a0\u65b0\u7684\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4\u3002
group.chat.bookmark.add = \u589e\u52a0\u5206\u7ec4\u5bf9\u8bdd\u4e66\u7b7e
bookmark.edit = \u7f16\u8f91\u4e66\u7b7e
bookmark.create = \u65b0\u5efa\u4e66\u7b7e
bookmark.created = \u4e00\u4e2a\u65b0\u7684\u4e66\u7b7e\u88ab\u5efa\u7acb
bookmark.url.name = URL\u540d\u5b57
bookmark.url.name.description = \u4f8b\u5982\uff1a\u6211\u4eec\u7684\u4e92\u8054\u7f51\u7ad9\u70b9
bookmark.url = URL
bookmark.url.manager.title = URL\u4e66\u7b7e\u7ba1\u7406
bookmark.url.manager.description = \u5141\u8bb8\u5728\u7528\u6237\u7684\u5ba2\u6237\u7aefURL\u4e66\u7b7e\u3002URL\u4e66\u7b7e\u5141\u8bb8\u76f4\u63a5\u4ece\u4ed6\u4eec\u7684\u5ba2\u6237\u7aef\u5feb\u901f\u7684\u8fdb\u5165\u5230\u9891\u7e41\u4f7f\u7528\u7684\u94fe\u63a5
bookmark.url.success = \u4e00\u4e2aURL\u4e66\u7b7e\u88ab\u5efa\u7acb
bookmark.url.deleted = URL\u4e66\u7b7e\u5220\u9664
bookmark.url.users = \u7528\u6237
bookmark.url.groups = \u7ec4
bookmark.url.rss = RSS
bookmark.url.options = \u53ef\u9009\u9879
bookmark.url.no.bookmarks = \u60a8\u5f53\u524d\u6ca1\u6709\u4efb\u4f55URL\u4e66\u7b7e\u3002\u5355\u51fb\u201c\u589e\u52a0URL\u4e66\u7b7e\u201d\u7528\u4e8e\u589e\u52a0\u4e00\u4e2a\u65b0\u7684URL\u4e66\u7b7e
bookmark.url.add = \u589e\u52a0URL\u4e66\u7b7e
bookmark.create.rss.feed = RSS\u53cd\u9988:
bookmark.create.all.users = \u6240\u6709\u7528\u6237
bookmark.url.error = \u8bf7\u6307\u5b9a\u4e00\u4e2aurl\u4f7f\u7528
bookmark.browse.users = \u6d4f\u89c8\u7528\u6237
bookmark.browse.groups = \u6d4f\u89c8\u5206\u7ec4
bookmark.users.groups.error = \u60a8\u5fc5\u987b\u6307\u5b9a\u7528\u6237\u4e0e\u7ec4\u7528\u4e8e\u521b\u5efa\u4e00\u4e2a\u6709\u6548\u7684\u4e66\u7b7e
bookmark.save.changes = \u4fdd\u5b58\u8bbe\u7f6e
bookmark.urlName.error = \u8bf7\u6307\u5b9aURL\u7684\u540d\u5b57
bookmark.groupchat.name.error = \u8bf7\u6307\u5b9a\u5206\u7ec4\u5bf9\u8bdd\u7684\u540d\u5b57
bookmark.groupchat.address.error = \u8bf7\u6307\u5b9a\u4e00\u4e2a\u6709\u6548\u7684\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4\u5730\u5740
bookmark.url.create.description = \u4f7f\u7528\u4e0b\u9762\u7684\u8868\u5355\u65b0\u5efa\u4e00\u4e2a\u65b0\u7684URL\u4e66\u7b7e
bookmark.groupchat.create.description = \u4f7f\u7528\u4e0b\u9762\u7684\u8868\u5355\u65b0\u5efa\u4e00\u4e2a\u65b0\u7684\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4\u4e66\u7b7e
bookmark.url.edit.description = \u4f7f\u7528\u4e0b\u9762\u7684\u8868\u5355\u7f16\u8f91URL\u4e66\u7b7e
bookmark.groupchat.edit.description = \u4f7f\u7528\u4e0b\u9762\u7684\u8868\u5355\u7f16\u8f91\u5206\u7ec4\u5bf9\u8bdd\u623f\u95f4\u4e66\u7b7e
bookmark.delete.confirm = \u5220\u9664\u8fd9\u4e2a\u4e66\u7b7e?
bookmark.delete.confirm.prompt = \u60a8\u662f\u5426\u786e\u5b9a\u5220\u9664\u8fd9\u4e2a\u4e66\u7b7e?
bookmark.delete.url.urlname = URL\u540d\u5b57:
bookmark.delete.url.url = URL:
bookmark.delete.url.users = \u7528\u6237:
bookmark.delete.url.groups = \u7ec4:
bookmark.delete.url.submit = \u5220\u9664
bookmark.delete.url.cancel = \u53d6\u6d88
bookmark.delete.chat.groupname = \u5206\u7ec4\u804a\u5929\u540d\u79f0:
bookmark.delete.chat.address = \u5206\u7ec4\u804a\u5929\u5730\u5740:
bookmark.delete.chat.users = \u7528\u6237:
bookmark.delete.chat.groups = \u7ec4:
bookmark.delete.chat.autojoin = \u81ea\u52a8\u52a0\u5165:
bookmark.delete.chat.submit = \u5220\u9664
bookmark.delete.chat.cancel = \u53d6\u6d88
# Dashboard
dashboard.title = Openfire\u4eea\u8868\u76d8
dashboard.description = \u5728Openfire\u4e2d\u5f53\u524d\u6d3b\u52a8\u7684\u5feb\u7167.
dashboard.directions = \u5355\u51fb\u4e0b\u9762\u7684\u56fe\u8868\u770b\u4e00\u4e2a\u653e\u5927\u7684\u56fe\u8c61
dashboard.snapshot.enlarge = \u653e\u5927\u56fe\u50cf
dashboard.snapshot.shrink = \u7f29\u5c0f\u56fe\u50cf
dashboard.timespan = \u65f6\u95f4\u95f4\u9694:
dashboard.timespan.lasthour = 1\u5c0f\u65f6
dashboard.timespan.last24hours = 24\u5c0f\u65f6
dashboard.timespan.last7days = 7\u5929
dashboard.spotlights.high = \u9ad8:
dashboard.spotlights.low = \u4f4e:
dashboard.spotlights.packetactivity = \u6bcf\u5206\u949f\u7684\u6570\u636e\u5305
dashboard.spotlights.activeconversations = \u6d3b\u52a8\u7684\u4f1a\u8bdd
dashboard.spotlights.currentusers = \u5f53\u524d\u7528\u6237
dashboard.quickstats = \u5feb\u901f\u72b6\u6001
dashboard.quickstats.high = \u9ad8
dashboard.quickstats.low = \u4f4e
dashboard.currentconversations = \u5f53\u524d\u7684\u4f1a\u8bdd
dashboard.currentconversations.details = \u67e5\u770b\u8be6\u7ec6\u8d44\u6599
dashboard.currentconversations.users = \u7528\u6237
dashboard.currentconversations.lastactivity = \u6700\u65b0\u7684\u6d3b\u52a8
dashboard.currentconversations.messagecount = \u4fe1\u606f
dashboard.currentconversations.none = \u975e\u6d3b\u52a8\u7684\u4f1a\u8bdd
# All Reports
allreports.title = \u6240\u6709\u7684\u62a5\u544a
allreports.daterange = \u65e5\u671f\u8303\u56f4
allreports.daterange.preset = \u4e8b\u5148\u8c03\u6574
allreports.daterange.preset.last60minutes = \u6700\u65b060\u5206\u949f
allreports.daterange.preset.last24hours = \u6700\u65b024\u5c0f\u65f6
allreports.daterange.preset.thisweek = \u672c\u5468
allreports.daterange.preset.last7days = \u6700\u8fd17\u5929
allreports.daterange.preset.lastweek = \u4e0a\u5468
allreports.daterange.preset.thismonth = \u672c\u6708
allreports.daterange.preset.lastmonth = \u4e0a\u4e2a\u6708
allreports.daterange.preset.last3months = \u6700\u8fd13\u4e2a\u6708
allreports.daterange.specific = \u7279\u522b\u6307\u5b9a
allreports.daterange.specific.startdate = \u5f00\u59cb:
allreports.daterange.specific.enddate = \u7ed3\u675f:
allreports.daterange.startdate.error = \u8bf7\u7528mm/dd/yy\u683c\u5f0f\u8f93\u5165\u4e00\u4e2a\u5f00\u59cb\u65e5\u671f
allreports.daterange.enddate.error = \u8bf7\u7528mm/dd/yy\u683c\u5f0f\u8f93\u5165\u4e00\u4e2a\u7ed3\u675f\u65e5\u671f
allreports.selectreport = \u9009\u62e9\u62a5\u544a
allreports.download.allreports = \u4e0b\u8f7d\u6240\u6709\u7684\u62a5\u544a
allreports.download.allreports.pdf = PDF
allreports.download.allreports.pdf.format = PDF\u683c\u5f0f
allreports.download.singlereport = \u4e0b\u8f7d\u8fd9\u4efd\u62a5\u544a:
allreports.download.singlereport.pdf = PDF
allreports.reportinformation = \u62a5\u544a\u4fe1\u606f
/**
* Copyright (C) 2008 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution, or a commercial license
* agreement with Jive.
*/
package org.jivesoftware.openfire.plugin;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.plugin.spark.SparkManager;
import org.jivesoftware.openfire.plugin.spark.BookmarkInterceptor;
import org.jivesoftware.openfire.plugin.spark.TaskEngine;
import org.jivesoftware.openfire.plugin.spark.manager.SparkVersionManager;
import org.jivesoftware.openfire.plugin.spark.manager.FileTransferFilterManager;
import java.io.File;
/**
* Client control plugin.
*
* @author Matt Tucker
*/
public class ClientControlPlugin implements Plugin {
private PluginManager pluginManager;
private SparkManager sparkManager;
private BookmarkInterceptor bookmarkInterceptor;
private SparkVersionManager sparkVersionManager;
private FileTransferFilterManager fileTransferFilterManager;
private TaskEngine taskEngine;
/**
* Constructs a new client control plugin.
*/
public ClientControlPlugin() {
}
// Plugin Interface
public void initializePlugin(PluginManager manager, File pluginDirectory) {
pluginManager = manager;
taskEngine = TaskEngine.getInstance();
sparkManager = new SparkManager(taskEngine);
sparkManager.start();
// Create and start the bookmark interceptor, which adds server-managed bookmarks when
// a user requests their bookmark list.
bookmarkInterceptor = new BookmarkInterceptor();
bookmarkInterceptor.start();
// Create and start the Spark version manager
sparkVersionManager = new SparkVersionManager();
sparkVersionManager.start();
fileTransferFilterManager = new FileTransferFilterManager();
fileTransferFilterManager.start();
}
public FileTransferFilterManager getFileTransferFilterManager() {
return fileTransferFilterManager;
}
public void destroyPlugin() {
pluginManager = null;
if (sparkManager != null) {
sparkManager.stop();
sparkManager.shutdown();
sparkManager = null;
}
if (bookmarkInterceptor != null) {
bookmarkInterceptor.stop();
bookmarkInterceptor = null;
}
if (sparkVersionManager != null) {
sparkVersionManager.shutdown();
sparkVersionManager = null;
}
if (fileTransferFilterManager != null) {
fileTransferFilterManager.stop();
fileTransferFilterManager = null;
}
taskEngine.shutdown();
}
}
\ No newline at end of file
/**
* $Revision: 3034 $
* $Date: 2005-11-04 21:02:33 -0300 (Fri, 04 Nov 2005) $
*
* Copyright (C) 2006 Jive Software. All rights reserved.
*
* This software is the proprietary information of Jive Software.
* Use is subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.database.JiveID;
import org.jivesoftware.database.SequenceManager;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.NotFoundException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Represents a Bookmark. Each bookmark can apply to a set of users and groups, or to
* everyone in the system. There are two types of bookmarks:<ul>
* <p/>
* <li>{@link Type#url url} -- a URL.
* <li>{@link Type#group_chat group chat} -- a group chat conference room.
* </ul>
* <p/>
* Each bookmark has a name and value. The value of the bokmark is either a URL or
* a conference room address, depending on the bookmark type. Each bookmark type has
* optional attributes stored as properties:<ul>
* <p/>
* <li><tt>autojoin</tt> ({@link Type#group_chat group chat} bookmarks): when set
* to <tt>true</tt>, the client is instructed to automatically join the
* conference room when starting up.</li>
* <li><tt>rss</tt> ({@link Type#url url} bookmarks): when set
* to <tt>true</tt>, indicates that the bookmark is for an RSS feed.</li>
* <li><tt>atom</tt> ({@link Type#url url} bookmarks): when set
* to <tt>true</tt>, indicates that the bookmark is for an ATOM feed.</li>
*
* @author Derek DeMoro, Matt Tucker
*/
@JiveID(55)
public class Bookmark {
private static final String INSERT_BOOKMARK =
"INSERT INTO ofBookmark(bookmarkID, bookmarkType, bookmarkName, bookmarkValue, " +
"isGlobal) VALUES (?,?,?,?,?)";
private static final String INSERT_BOOKMARK_PERMISSIONS =
"INSERT INTO ofBookmarkPerm(bookmarkID, bookmarkType, name) VALUES(?,?,?)";
private static final String LOAD_BOOKMARK_PERMISSIONS =
"SELECT bookmarkType, name FROM ofBookmarkPerm WHERE bookmarkID=?";
private static final String SAVE_BOOKMARK_PERMISSIONS =
"UPDATE ofBookmarkPerm SET bookmarkType=?, name=? WHERE bookmarkID=?";
private static final String DELETE_BOOKMARK_PERMISSIONS =
"DELETE from ofBookmarkPerm WHERE bookmarkID=?";
private static final String SAVE_BOOKMARK =
"UPDATE ofBookmark SET bookmarkType=?, bookmarkName=?, bookmarkValue=?, isGlobal=? " +
"WHERE bookmarkID=?";
private static final String LOAD_BOOKMARK =
"SELECT bookmarkType, bookmarkName, bookmarkValue, isGlobal FROM " +
"ofBookmark WHERE bookmarkID=?";
private static final String LOAD_PROPERTIES =
"SELECT name, propValue FROM ofBookmarkProp WHERE bookmarkID=?";
private static final String INSERT_PROPERTY =
"INSERT INTO ofBookmarkProp (bookmarkID,name,propValue) VALUES (?,?,?)";
private static final String UPDATE_PROPERTY =
"UPDATE ofBookmarkProp SET propValue=? WHERE name=? AND bookmarkID=?";
private static final String DELETE_PROPERTY =
"DELETE FROM ofBookmarkProp WHERE bookmarkID=? AND name=?";
private long bookmarkID;
private Type type;
private String name;
private String value;
private boolean global;
private Collection<String> users;
private Collection<String> groups;
private Map<String, String> properties;
private static int USERS = 0;
private static int GROUPS = 1;
/**
* Creates a new bookmark.
*
* @param type the bookmark type.
* @param name the name of the bookmark.
* @param value the value of the bookmark.
*/
public Bookmark(Type type, String name, String value) {
this.type = type;
this.name = name;
this.value = value;
properties = new HashMap<String, String>();
try {
insertIntoDb();
insertBookmarkPermissions();
}
catch (Exception e) {
Log.error(e);
}
}
/**
* Loads an existing bookmark based on its ID.
*
* @param bookmarkID the bookmark ID.
* @throws NotFoundException if the bookmark does not exist or could not be loaded.
*/
public Bookmark(long bookmarkID) throws NotFoundException {
this.bookmarkID = bookmarkID;
loadFromDb();
loadPermissions();
}
/**
* Returns the unique ID of the bookmark.
*
* @return the bookmark ID.
*/
public long getBookmarkID() {
return bookmarkID;
}
/**
* Returns the {@link Type type} of the bookmark.
*
* @return the bookmark type.
*/
public Type getType() {
return type;
}
/**
* Sets the bookmark {@link Type type}.
*
* @param type the type of the bookmark.
*/
public void setType(Type type) {
this.type = type;
}
/**
* Returns the name of the bookmark; either the name of the URL or name of the
* conference room.
*
* @return the name of the bookmark.
*/
public String getName() {
return name;
}
/**
* Sets the name of the bookmark; either the name of the URL or name of the
* conference room.
*
* @param name the name of the bookmark.
*/
public void setName(String name) {
if (name == null) {
throw new IllegalArgumentException("Bookmark name must not be null.");
}
this.name = name;
saveToDb();
}
/**
* Returns the value of the bookmark; either a URL or a conference room address.
*
* @return the value of the bookmark.
*/
public String getValue() {
return value;
}
/**
* Sets the value of the bookmark; either a URL or a conference room address.
*
* @param value the value of the bookmark.
*/
public void setValue(String value) {
if (value == null) {
throw new IllegalArgumentException("Bookmark value must not be null.");
}
this.value = value;
saveToDb();
}
/**
* Returns the collection of usersnames that have been assigned the bookmark.
*
* @return the collection of usernames that have been assigned the bookmark.
*/
public Collection<String> getUsers() {
return users;
}
/**
* Sets the collection of usernames that have been assigned the bookmark.
*
* @param users the collection of usernames.
*/
public void setUsers(Collection<String> users) {
this.users = users;
saveToDb();
insertBookmarkPermissions();
}
/**
* Returns the collection of group names that have been assigned the the bookmark.
*
* @return a collection of group names.
*/
public Collection<String> getGroups() {
return groups;
}
public void setGroups(Collection<String> groups) {
this.groups = groups;
saveToDb();
insertBookmarkPermissions();
}
/**
* Returns true if this bookmark is applied to all users on the server. When true,
* the values for {@link #getGroups()} and {@link #getUsers()} have no effect.
*
* @return true if a global bookmark.
*/
public boolean isGlobalBookmark() {
return global;
}
/**
* Sets whether the bookmark is applied to all users on the server. When true,
* the values for {@link #getGroups()} and {@link #getUsers()} have no effect.
*
* @param global true if this is a global bookmark.
*/
public void setGlobalBookmark(boolean global) {
this.global = global;
saveToDb();
}
/**
* Returns an extended property. Each bookmark can have
* an arbitrary number of extended properties. This allows for enhanced
* functionality that is not part of the base interface.
*
* @param name the name of the property to get.
* @return the value of the property specified by <tt>name</tt>.
*/
public String getProperty(String name) {
if (properties == null) {
loadPropertiesFromDb();
}
return properties.get(name);
}
/**
* Return all immediate children property values of a parent property as an
* unmodifiable Collection of String values. A parent/child relationship is
* denoted by the "." character. For example, given the properties <tt>X.Y.A</tt>,
* <tt>X.Y.B</tt>, <tt>X.Y.C</tt> and <tt>X.Y.C.D</tt>, then the immediate child
* properties of <tt>X.Y</tt> are <tt>X.Y.A</tt>, <tt>X.Y.B</tt>, and <tt>X.Y.C</tt>
* (the value of <tt>X.Y.C.D</tt> would not be returned using this method).
*
* @param parentName the name of the parent property to return the children for.
* @return all Collection of all child property values for the given parent.
*/
public Collection<String> getProperties(String parentName) {
Object [] keys = properties.keySet().toArray();
ArrayList<String> results = new ArrayList<String>();
for (int i = 0, n = keys.length; i < n; i++) {
String key = (String)keys[i];
if (key.startsWith(parentName)) {
if (key.equals(parentName)) {
continue;
}
if (key.substring(parentName.length()).lastIndexOf(".") == 0) {
results.add(properties.get(key));
}
}
}
return Collections.unmodifiableCollection(results);
}
/**
* Sets an extended property. Each bookmark can have an
* arbitrary number of extended properties. This allows for enhanced
* functionality that is not part of the base interface.<p>
* <p/>
* If the property referenced by <code>name</code> already exists, its
* value will be updated.
*
* @param name the name of the property to set.
* @param value the new value for the property.
*/
public void setProperty(String name, String value) {
if (properties == null) {
loadPropertiesFromDb();
}
// See if we need to update a property value or insert a new one.
if (properties.containsKey(name)) {
// Only update the value in the database if the property value
// has changed.
if (!(value.equals(properties.get(name)))) {
properties.put(name, value);
updatePropertyInDb(name, value);
}
}
else {
properties.put(name, value);
insertPropertyIntoDb(name, value);
}
}
/**
* Deletes an extended property. If the property specified by
* <code>name</code> does not exist, this method will do nothing.
*
* @param name the name of the property to delete.
*/
public void deleteProperty(String name) {
if (properties == null) {
loadPropertiesFromDb();
}
// Only delete the property if it exists.
if (properties.containsKey(name)) {
properties.remove(name);
deletePropertyFromDb(name);
}
}
/**
* Returns an Iterator for the names of the extended properties.
*
* @return an Iterator for the names of the extended properties.
*/
public Iterator getPropertyNames() {
if (properties == null) {
loadPropertiesFromDb();
}
return Collections.unmodifiableSet(properties.keySet()).iterator();
}
/**
* Tye type of the bookmark.
*/
@SuppressWarnings({"UnnecessarySemicolon"}) // Fix for QDox Source inspector
public enum Type {
/**
* A URL (typically HTTP).
*/
url,
/**
* A group chat conference room address.
*/
group_chat;
}
/**
* Inserts a new bookmark into the database.
*/
private void insertIntoDb() throws SQLException {
this.bookmarkID = SequenceManager.nextID(this);
Connection con = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
PreparedStatement pstmt = con.prepareStatement(INSERT_BOOKMARK);
pstmt.setLong(1, bookmarkID);
pstmt.setString(2, type.toString());
pstmt.setString(3, name);
pstmt.setString(4, value);
pstmt.setInt(5, global ? 1 : 0);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException sqle) {
abortTransaction = true;
throw sqle;
}
finally {
DbConnectionManager.closeTransactionConnection(con, abortTransaction);
}
}
private void insertBookmarkPermissions() {
// Delete other permission.
try {
deleteBookmarkPermissions();
}
catch (SQLException e) {
Log.error(e);
}
// Persist users
if (users != null) {
for (String user : users) {
try {
insertBookmarkPermission(USERS, user);
}
catch (SQLException e) {
Log.error(e);
}
}
}
if (groups != null) {
for (String group : groups) {
try {
insertBookmarkPermission(GROUPS, group);
}
catch (SQLException e) {
Log.error(e);
}
}
}
}
private void insertBookmarkPermission(int type, String name) throws SQLException {
Connection con = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
PreparedStatement pstmt = con.prepareStatement(INSERT_BOOKMARK_PERMISSIONS);
pstmt.setLong(1, bookmarkID);
pstmt.setInt(2, type);
pstmt.setString(3, name);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException sqle) {
abortTransaction = true;
throw sqle;
}
finally {
DbConnectionManager.closeTransactionConnection(con, abortTransaction);
}
}
private void deleteBookmarkPermissions() throws SQLException {
Connection con = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
PreparedStatement pstmt = con.prepareStatement(DELETE_BOOKMARK_PERMISSIONS);
pstmt.setLong(1, bookmarkID);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException sqle) {
abortTransaction = true;
throw sqle;
}
finally {
DbConnectionManager.closeTransactionConnection(con, abortTransaction);
}
}
private void loadPermissions() {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<String> usersList = new ArrayList<String>();
List<String> groupList = new ArrayList<String>();
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_BOOKMARK_PERMISSIONS);
pstmt.setLong(1, bookmarkID);
rs = pstmt.executeQuery();
while (rs.next()) {
int type = rs.getInt(1);
String name = rs.getString(2);
if (type == USERS) {
usersList.add(name);
}
else {
groupList.add(name);
}
}
rs.close();
pstmt.close();
users = usersList;
groups = groupList;
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
}
/**
* Loads a bookmark from the database.
*
* @throws NotFoundException if the bookmark could not be loaded.
*/
private void loadFromDb() throws NotFoundException {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_BOOKMARK);
pstmt.setLong(1, bookmarkID);
rs = pstmt.executeQuery();
if (!rs.next()) {
throw new NotFoundException("Bookmark not found: " + bookmarkID);
}
this.type = Type.valueOf(rs.getString(1));
this.name = rs.getString(2);
this.value = rs.getString(3);
this.global = rs.getInt(4) == 1;
rs.close();
pstmt.close();
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
}
/**
* Saves a bookmark to the database.
*/
private void saveToDb() {
Connection con = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
PreparedStatement pstmt = con.prepareStatement(SAVE_BOOKMARK);
pstmt.setString(1, type.toString());
pstmt.setString(2, name);
pstmt.setString(3, value);
pstmt.setInt(4, global ? 1 : 0);
pstmt.setLong(5, bookmarkID);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException sqle) {
abortTransaction = true;
Log.error(sqle);
}
finally {
DbConnectionManager.closeTransactionConnection(con, abortTransaction);
}
}
/**
* Loads properties from the database.
*/
private synchronized void loadPropertiesFromDb() {
this.properties = new Hashtable<String, String>();
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_PROPERTIES);
pstmt.setLong(1, bookmarkID);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String name = rs.getString(1);
String value = rs.getString(2);
properties.put(name, value);
}
rs.close();
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
DbConnectionManager.closeConnection(pstmt, con);
}
}
/**
* Inserts a new property into the datatabase.
*/
private void insertPropertyIntoDb(String name, String value) {
Connection con = null;
PreparedStatement pstmt = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
pstmt = con.prepareStatement(INSERT_PROPERTY);
pstmt.setLong(1, bookmarkID);
pstmt.setString(2, name);
pstmt.setString(3, value);
pstmt.executeUpdate();
}
catch (SQLException sqle) {
Log.error(sqle);
abortTransaction = true;
}
finally {
DbConnectionManager.closeTransactionConnection(pstmt, con, abortTransaction);
}
}
/**
* Updates a property value in the database.
*/
private void updatePropertyInDb(String name, String value) {
Connection con = null;
PreparedStatement pstmt = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
pstmt = con.prepareStatement(UPDATE_PROPERTY);
pstmt.setString(1, value);
pstmt.setString(2, name);
pstmt.setLong(3, bookmarkID);
pstmt.executeUpdate();
}
catch (SQLException sqle) {
Log.error(sqle);
abortTransaction = true;
}
finally {
DbConnectionManager.closeTransactionConnection(pstmt, con, abortTransaction);
}
}
/**
* Deletes a property from the db.
*/
private synchronized void deletePropertyFromDb(String name) {
Connection con = null;
PreparedStatement pstmt = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
pstmt = con.prepareStatement(DELETE_PROPERTY);
pstmt.setLong(1, bookmarkID);
pstmt.setString(2, name);
pstmt.execute();
}
catch (SQLException sqle) {
Log.error(sqle);
abortTransaction = true;
}
finally {
DbConnectionManager.closeTransactionConnection(pstmt, con, abortTransaction);
}
}
}
/**
* $Revision$
* $Date$
*
* Copyright (C) 1999-2005 Jive Software. All rights reserved.
* This software is the proprietary information of Jive Software. Use is subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark;
import org.dom4j.Element;
import org.jivesoftware.util.Log;
import org.jivesoftware.openfire.group.Group;
import org.jivesoftware.openfire.group.GroupManager;
import org.jivesoftware.openfire.group.GroupNotFoundException;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import java.util.Collection;
import java.util.Iterator;
/**
* Intercepts Bookmark Storage requests and appends all server based Bookmarks to
* the result.
*
* @author Derek DeMoro
*/
public class BookmarkInterceptor implements PacketInterceptor {
/**
* Initializes the BookmarkInterceptor and needed Server instances.
*/
public BookmarkInterceptor() {
}
public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException {
if (!processed && packet instanceof IQ && !incoming) {
// Check for the Bookmark Storage element and hand off to the Bookmark engine.
IQ iq = (IQ)packet;
Element childElement = iq.getChildElement();
if (childElement == null || iq.getType() != IQ.Type.result) {
return;
}
String namespace = childElement.getNamespaceURI();
if ("jabber:iq:private".equals(namespace)) {
// In private data, when a user is attempting to retrieve bookmark
// information, there will be a storage:bookmarks namespace.
Element storageElement = childElement.element("storage");
if (storageElement == null) {
return;
}
namespace = storageElement.getNamespaceURI();
if ("storage:bookmarks".equals(namespace)) {
// Append Server defined bookmarks for user.
JID toJID = iq.getTo();
addBookmarks(toJID, storageElement);
}
}
}
}
/**
* Add this interceptor to the interceptor manager.
*/
public void start() {
InterceptorManager.getInstance().addInterceptor(this);
}
/**
* Remove this interceptor from the interceptor manager.
*/
public void stop() {
InterceptorManager.getInstance().removeInterceptor(this);
}
/**
* Adds all server defined bookmarks to the users requested
* bookmarks.
*
* @param jid the jid of the user requesting the bookmark(s)
* @param storageElement the JEP-0048 compliant storage element.
*/
private void addBookmarks(JID jid, Element storageElement) {
final Collection<Bookmark> bookmarks = BookmarkManager.getBookmarks();
for (Bookmark bookmark : bookmarks) {
// Check to see if the bookmark should be appended for this
// particular user.
boolean addBookmarkForUser = bookmark.isGlobalBookmark() || isBookmarkForJID(jid, bookmark);
if (addBookmarkForUser) {
// Add bookmark element.
addBookmarkElement(jid, bookmark, storageElement);
}
}
}
/**
* True if the specified bookmark should be appended to the users list of
* bookmarks.
*
* @param jid the jid of the user.
* @param bookmark the bookmark.
* @return true if bookmark should be appended.
*/
private static boolean isBookmarkForJID(JID jid, Bookmark bookmark) {
String username = jid.getNode();
if (bookmark.getUsers().contains(username)) {
return true;
}
Collection<String> groups = bookmark.getGroups();
if (groups != null && !groups.isEmpty()) {
GroupManager groupManager = GroupManager.getInstance();
for (String groupName : groups) {
try {
Group group = groupManager.getGroup(groupName);
if (group.isUser(jid.getNode())) {
return true;
}
}
catch (GroupNotFoundException e) {
Log.debug(e);
}
}
}
return false;
}
/**
* Adds a Bookmark to the users defined list of bookmarks.
*
* @param jid the users jid.
* @param bookmark the bookmark to be added.
* @param element the storage element to append to.
*/
private void addBookmarkElement(JID jid, Bookmark bookmark, Element element) {
final UserManager userManager = UserManager.getInstance();
try {
userManager.getUser(jid.getNode());
}
catch (UserNotFoundException e) {
return;
}
// If this is a URL Bookmark, check to make sure we
// do not add duplicate bookmarks.
if (bookmark.getType() == Bookmark.Type.url) {
Element urlBookmarkElement = urlExists(element, bookmark.getValue());
if (urlBookmarkElement == null) {
urlBookmarkElement = element.addElement("url");
urlBookmarkElement.addAttribute("name", bookmark.getName());
urlBookmarkElement.addAttribute("url", bookmark.getValue());
// Add an RSS attribute to the bookmark if it's defined. RSS isn't an
// official part of the Bookmark JEP, but we define it as a logical
// extension.
boolean rss = Boolean.valueOf(bookmark.getProperty("rss"));
if (rss) {
urlBookmarkElement.addAttribute("rss", Boolean.toString(rss));
}
}
appendSharedElement(urlBookmarkElement);
}
// Otherwise it's a conference bookmark.
else {
try {
Element conferenceElement = conferenceExists(element, bookmark.getValue());
// If the conference bookmark does not exist, add it to the current
// reply.
if (conferenceElement == null) {
conferenceElement = element.addElement("conference");
conferenceElement.addAttribute("name", bookmark.getName());
boolean autojoin = Boolean.valueOf(bookmark.getProperty("autojoin"));
conferenceElement.addAttribute("autojoin", Boolean.toString(autojoin));
conferenceElement.addAttribute("jid", bookmark.getValue());
}
appendSharedElement(conferenceElement);
}
catch (Exception e) {
Log.error(e);
}
}
}
/**
* Adds the shared namespace element to indicate to clients that this bookmark is a shared bookmark.
*
* @param bookmarkElement the bookmark to add the shared element to.
*/
private static void appendSharedElement(Element bookmarkElement) {
bookmarkElement.addElement("shared_bookmark", "http://jivesoftware.com/jeps/bookmarks");
}
/**
* Checks if the bookmark has already been defined in the users private storage.
*
* @param element the private storage element.
* @param url the url to search for.
* @return true if the bookmark already exists.
*/
private static Element urlExists(Element element, String url) {
// Iterate through current elements to see if this url already exists.
// If one does not exist, then add the bookmark.
final Iterator urlBookmarks = element.elementIterator("url");
while (urlBookmarks.hasNext()) {
Element urlElement = (Element)urlBookmarks.next();
String urlValue = urlElement.attributeValue("url");
if (urlValue.equalsIgnoreCase(url)) {
return urlElement;
}
}
return null;
}
/**
* Checks if the conference bookmark has already been defined in the users private storage.
*
* @param element the private storage element.
* @param roomJID the JID of the room to find.
* @return true if the bookmark exists.
*/
private Element conferenceExists(Element element, String roomJID) {
// Iterate through current elements to see if the conference bookmark
// already exists.
final Iterator conferences = element.elementIterator("conference");
while (conferences.hasNext()) {
final Element conferenceElement = (Element)conferences.next();
String jidValue = conferenceElement.attributeValue("jid");
if (jidValue != null && roomJID != null && jidValue.equalsIgnoreCase(roomJID)) {
return conferenceElement;
}
}
return null;
}
}
/**
* $Revision$
* $Date$
*
* Copyright (C) 1999-2005 Jive Software. All rights reserved.
* This software is the proprietary information of Jive Software. Use is subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.util.Log;
import org.jivesoftware.util.NotFoundException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Manages global bookmarks. Bookmarks are defined by
* <a href="http://www.jabber.org/jeps/jep-0048.html">JEP-0048</a>. Users can define and
* manage their own bookmarks. Global bookmarks add to a user's own bookmarks and are
* defined by system administrators to apply to all users, groups, or sets of users.
*
* @see Bookmark
* @author Derek DeMoro
*/
public class BookmarkManager {
private static final String DELETE_BOOKMARK = "DELETE FROM ofBookmark where bookmarkID=?";
private static final String SELECT_BOOKMARKS = "SELECT bookmarkID from ofBookmark";
/**
* Returns the specified bookmark.
*
* @param bookmarkID the ID of the bookmark.
* @return the bookmark.
* @throws NotFoundException if the bookmark could not be found or loaded.
*/
public Bookmark getBookmark(long bookmarkID) throws NotFoundException {
// TODO add caching
return new Bookmark(bookmarkID);
}
/**
* Returns all bookmarks.
*
* @return the collection of bookmarks.
*/
public static Collection<Bookmark> getBookmarks() {
// TODO: add caching.
List<Bookmark> bookmarks = new ArrayList<Bookmark>();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(SELECT_BOOKMARKS);
rs = pstmt.executeQuery();
while (rs.next()) {
long bookmarkID = rs.getLong(1);
try {
Bookmark bookmark = new Bookmark(bookmarkID);
bookmarks.add(bookmark);
}
catch (NotFoundException nfe) {
Log.error(nfe);
}
}
}
catch (SQLException e) {
Log.error(e);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return bookmarks;
}
/**
* Deletes a bookmark with the specified bookmark ID.
*
* @param bookmarkID the ID of the bookmark to remove from the database.
*/
public static void deleteBookmark(long bookmarkID) {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(DELETE_BOOKMARK);
pstmt.setLong(1, bookmarkID);
pstmt.execute();
}
catch (SQLException e) {
Log.error(e);
}
finally {
DbConnectionManager.closeConnection(pstmt, con);
}
}
}
\ No newline at end of file
/**
* Copyright (C) 1999-2008 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution, or a commercial license
* agreement with Jive.
*/
package org.jivesoftware.openfire.plugin.spark;
import org.jivesoftware.openfire.plugin.spark.manager.SparkVersionManager;
import org.dom4j.Element;
import org.jivesoftware.openfire.SessionManager;
import org.jivesoftware.openfire.event.SessionEventDispatcher;
import org.jivesoftware.openfire.event.SessionEventListener;
import org.jivesoftware.openfire.session.ClientSession;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.openfire.stats.StatisticsManager;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.Log;
import org.xmpp.component.Component;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManager;
import org.xmpp.component.ComponentManagerFactory;
import org.xmpp.packet.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Handles querying and notifications of enabled client features within the server, as well
* as track related statistics, such as invalid client connections and number of Spark connections.
*
* @author Derek DeMoro
*/
public class SparkManager implements Component {
private static final String INVALID_DISCONNECTS_KEY = "disconnects";
private static final String SPARK_CLIENTS_KEY = "spark";
private ComponentManager componentManager;
private SessionManager sessionManager;
private SparkSessionListener sessionEventListener;
/**
* Tracks number of disconnected clients.
*/
private AtomicInteger disconnects;
private StatisticsManager statisticsManager;
private TaskEngine taskEngine;
/**
* Defined Service Name for Component.
*/
private String serviceName = "manager";
/**
* Creates a new instance of the SparkManager to allow for listening and responding to
* newly created client sessions.
*
* @param taskEngine the taskEngine.
*/
public SparkManager(TaskEngine taskEngine) {
this.taskEngine = taskEngine;
sessionManager = SessionManager.getInstance();
sessionEventListener = new SparkSessionListener();
statisticsManager = StatisticsManager.getInstance();
componentManager = ComponentManagerFactory.getComponentManager();
// Register the SparkManager Component with the component manager
// using the defined service name. This component is cluster-safe.
try {
componentManager.addComponent(serviceName, this);
}
catch (Exception e) {
componentManager.getLog().error(e);
}
// Add VersionManager. This component is cluster-safe.
try {
componentManager.addComponent(SparkVersionManager.SERVICE_NAME, new SparkVersionManager());
}
catch (Exception e) {
componentManager.getLog().error(e);
}
// Add SessionListener
SessionEventDispatcher.addListener(sessionEventListener);
disconnects = new AtomicInteger(0);
}
public String getName() {
return "Features Component";
}
public String getDescription() {
return "Allows for discovery of certain features.";
}
/**
* Client features are detected using Service Discovery, allowing
* for ease of use within the client. When a client "discovers" the
* manager, they can query for related features within that discovered item.
*
* @param packet the packet
*/
public void processPacket(Packet packet) {
if (packet instanceof IQ) {
IQ iqPacket = (IQ)packet;
Element childElement = (iqPacket).getChildElement();
String namespace = null;
if (childElement != null) {
namespace = childElement.getNamespaceURI();
}
if (IQ.Type.get == iqPacket.getType()) {
// Handle any disco info requests.
if ("http://jabber.org/protocol/disco#info".equals(namespace)) {
handleDiscoInfo(iqPacket);
}
// Handle any disco item requests.
else if ("http://jabber.org/protocol/disco#items".equals(namespace)) {
handleDiscoItems(iqPacket);
}
else if ("jabber:iq:version".equals(namespace)) {
IQ reply = IQ.createResultIQ(iqPacket);
Element version = reply.setChildElement("query", "jabber:iq:version");
version.addElement("name").setText("Enterprise Manager");
version.addElement("version").setText("3.2");
sendPacket(reply);
}
else {
// Return error since this is an unknown service request
IQ reply = IQ.createResultIQ(iqPacket);
reply.setError(PacketError.Condition.service_unavailable);
sendPacket(reply);
}
}
else if (IQ.Type.error == iqPacket.getType() || IQ.Type.result == iqPacket.getType()) {
if ("jabber:iq:version".equals(namespace)) {
handleClientVersion(iqPacket);
}
}
else {
// Return error since this is an unknown service request
IQ reply = IQ.createResultIQ(iqPacket);
reply.setError(PacketError.Condition.service_unavailable);
sendPacket(reply);
}
}
}
/**
* Handles the IQ version reply. If only a given list of clients are allowed to connect
* then the reply will be analyzed. If the client is not present in the list, no name
* was responsed or an IQ error was returned (e.g. IQ version not supported) then
* the client session will be terminated.
*
* @param iq the IQ version reply sent by the client.
*/
private void handleClientVersion(IQ iq) {
final String clientsAllowed = JiveGlobals.getProperty("clients.allowed", "all");
final boolean disconnectIfNoMatch = !"all".equals(clientsAllowed);
if ("all".equals(clientsAllowed) || !disconnectIfNoMatch) {
// There is nothing to do here. Just return.
return;
}
// Get the client session of the user that sent the IQ version response
ClientSession session = sessionManager.getSession(iq.getFrom());
if (session == null) {
// Do nothing if the session no longer exists
return;
}
if (IQ.Type.result == iq.getType()) {
// Get list of allowed clients to connect
final List<String> clients = new ArrayList<String>();
StringTokenizer clientTokens = new StringTokenizer(clientsAllowed, ",");
while (clientTokens.hasMoreTokens()) {
clients.add(clientTokens.nextToken().toLowerCase());
}
final String otherClientsAllowed = JiveGlobals.getProperty("other.clients.allowed", "");
clientTokens = new StringTokenizer(otherClientsAllowed, ",");
while (clientTokens.hasMoreTokens()) {
clients.add(clientTokens.nextToken().toLowerCase().trim());
}
Element child = iq.getChildElement();
String clientName = child.elementTextTrim("name");
boolean disconnect = true;
if (clientName != null) {
// Check if the client should be disconnected
for(String c : clients){
if(clientName.toLowerCase().contains(c)){
disconnect = false;
break;
}
}
}
else {
// Always disconnect clients that didn't provide their name
disconnect = true;
}
if (disconnect) {
closeSession(session, clientName != null ? clientName : "Unknown");
}
}
else {
// If the session is invalid. Close the connection.
closeSession(session, "Unknown");
}
}
public void initialize(JID jid, ComponentManager componentManager) throws ComponentException {
// Do nothing.
}
public void start() {
// Do nothing.
}
/**
* Unload the Component.
*/
public void stop() {
// Unregister components
try {
componentManager.removeComponent(SparkVersionManager.SERVICE_NAME);
// Finally remove this service (this will set null to componentManager)
componentManager.removeComponent(serviceName);
}
catch (ComponentException e) {
componentManager.getLog().error(e);
}
taskEngine = null;
}
/**
* Remove any resources SparkManager was using. This will allow
* for a clean reload.
*/
public void shutdown() {
// Cleanup
SessionEventDispatcher.removeListener(sessionEventListener);
if (statisticsManager != null) {
statisticsManager.removeStatistic(SPARK_CLIENTS_KEY);
statisticsManager.removeStatistic(INVALID_DISCONNECTS_KEY);
}
componentManager = null;
sessionManager = null;
sessionEventListener = null;
statisticsManager = null;
}
/**
* Sends a reply for a ServiceDiscovery.
*
* @param packet the packet.
*/
private void handleDiscoItems(IQ packet) {
IQ replyPacket = IQ.createResultIQ(packet);
replyPacket.setChildElement("query", "http://jabber.org/protocol/disco#items");
sendPacket(replyPacket);
}
/**
* Send a reply back to the client to inform the client that this server has
* a Spark Manager.
*
* @param packet the IQ packet.
*/
private void handleDiscoInfo(IQ packet) {
IQ replyPacket = IQ.createResultIQ(packet);
Element responseElement =
replyPacket.setChildElement("query", "http://jabber.org/protocol/disco#info");
Element identity = responseElement.addElement("identity");
identity.addAttribute("category", "manager");
identity.addAttribute("type", "text");
identity.addAttribute("name", "Enterprise Manager");
// Add features set
buildFeatureSet(responseElement);
// Send reply
sendPacket(replyPacket);
}
private void sendPacket(Packet packet) {
try {
componentManager.sendPacket(this, packet);
}
catch (ComponentException e) {
componentManager.getLog().error(e);
}
}
/**
* Builds an element list of all features enabled.
*
* @param responseElement the feature response element.
*/
private void buildFeatureSet(Element responseElement) {
// Check for broadcast service.
boolean broadcastEnabled = Boolean.parseBoolean(JiveGlobals.getProperty("broadcast.enabled", "true"));
if (broadcastEnabled) {
responseElement.addElement("feature").addAttribute("var", "broadcast");
}
boolean fileTransferEnabled = Boolean.parseBoolean(JiveGlobals.getProperty("transfer.enabled", "true"));
if (fileTransferEnabled) {
responseElement.addElement("feature").addAttribute("var", "file-transfer");
}
boolean mucEnabled = Boolean.parseBoolean(JiveGlobals.getProperty("muc.enabled", "true"));
if (mucEnabled) {
responseElement.addElement("feature").addAttribute("var", "muc");
}
boolean vcardEnabled = Boolean.parseBoolean(JiveGlobals.getProperty("vcard.enabled", "true"));
if (vcardEnabled) {
responseElement.addElement("feature").addAttribute("var", "vcard");
}
}
/**
* Notify all users who have requested disco information from this component that settings have been changed.
* Clients should perform a new service discovery to see what has changed.
*/
public void notifyDiscoInfoChanged() {
final Message message = new Message();
message.setFrom(serviceName + "." + componentManager.getServerName());
Element child = message.addChildElement("event", "http://jabber.org/protocol/disco#info");
buildFeatureSet(child);
sessionManager.broadcast(message);
}
/**
* Listener to check all new client connections to validate against
* the server side client validate scheme.
*/
private class SparkSessionListener implements SessionEventListener {
/**
* A new session was created.
*
* @param session the newly created session.
*/
public void sessionCreated(final Session session) {
// Check to see if Spark is required.
String clientsAllowed = JiveGlobals.getProperty("clients.allowed", "all");
final boolean disconnectIfNoMatch = !"all".equals(clientsAllowed);
if (disconnectIfNoMatch) {
// TODO: A future version may want to close sessions of users that never
// TODO: responded the IQ version request.
taskEngine.schedule(new TimerTask() {
public void run() {
requestSoftwareVersion(session);
}
}, 5000);
}
}
/**
* A session was destroyed.
*
* @param session the session destroyed.
*/
public void sessionDestroyed(Session session) {
}
public void resourceBound(Session session) {
// Do nothing.
}
public void anonymousSessionCreated(Session session) {
// Ignore.
}
public void anonymousSessionDestroyed(Session session) {
// Ignore.
}
}
/**
* Make a version request (JEP-0092) of the client the specified session is using. If the response is NOT the Spark IM
* client, send a StreamError notification and disconnect the user.
*
* @param session the users session.
*/
private void requestSoftwareVersion(final Session session) {
// Send IQ get to check client version.
final IQ clientPacket = new IQ(IQ.Type.get);
clientPacket.setTo(session.getAddress());
clientPacket.setFrom(serviceName + "." + componentManager.getServerName());
clientPacket.setChildElement("query", "jabber:iq:version");
sendPacket(clientPacket);
}
/**
* Sends an unsupported version error and name of client the user attempted to connect with.
*
* @param session the users current session.
* @param clientName the name of the client they were connecting with.
*/
private void closeSession(final Session session, String clientName) {
// Increase the number of logins not allowed by 1.
disconnects.incrementAndGet();
Log.debug("Closed connection to client attempting to connect from " + clientName);
// Send message information user.
final Message message = new Message();
message.setFrom(serviceName + "." + componentManager.getServerName());
message.setTo(session.getAddress());
message.setBody("You are using an invalid client, and therefore will be disconnected. "
+ "Please ask your system administrator for client choices.");
// Send Message
sendPacket(message);
// Disconnect user after 5 seconds.
taskEngine.schedule(new TimerTask() {
public void run() {
// Include the not-authorized error in the response
StreamError error = new StreamError(StreamError.Condition.policy_violation);
session.deliverRawText(error.toXML());
// Close the underlying connection
session.close();
}
}, 5000);
}
/**
* Returns the number of logins which were not valid due to Spark Manager restrictions.
*
* @return the number of logins not allowed.
*/
public int getNumberOfLoginsNotAllowed() {
return disconnects.getAndSet(0);
}
}
\ No newline at end of file
/**
* $Revision$
* $Date$
*
* Copyright (C) 1999-2005 Jive Software. All rights reserved.
* This software is the proprietary information of Jive Software. Use is subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* Utility methods frequently used by data classes and design-time
* classes.
*/
public final class SparkUtil {
private SparkUtil() {
// Prevent instantiation.
}
/**
* This is a utility method that compares two objects when one or
* both of the objects might be <CODE>null</CODE> The result of
* this method is determined as follows:
* <OL>
* <LI>If <CODE>o1</CODE> and <CODE>o2</CODE> are the same object
* according to the <CODE>==</CODE> operator, return
* <CODE>true</CODE>.
* <LI>Otherwise, if either <CODE>o1</CODE> or <CODE>o2</CODE> is
* <CODE>null</CODE>, return <CODE>false</CODE>.
* <LI>Otherwise, return <CODE>o1.equals(o2)</CODE>.
* </OL>
* <p/>
* This method produces the exact logically inverted result as the
* {@link #areDifferent(Object, Object)} method.<P>
* <p/>
* For array types, one of the <CODE>equals</CODE> methods in
* {@link java.util.Arrays} should be used instead of this method.
* Note that arrays with more than one dimension will require some
* custom code in order to implement <CODE>equals</CODE> properly.
*/
public static final boolean areEqual(Object o1, Object o2) {
if (o1 == o2) {
return true;
}
else if (o1 == null || o2 == null) {
return false;
}
else {
return o1.equals(o2);
}
}
/**
* This is a utility method that compares two Booleans when one or
* both of the objects might be <CODE>null</CODE> The result of
* this method is determined as follows:
* <OL>
* <LI>If <CODE>b1</CODE> and <CODE>b2</CODE> are both TRUE or
* neither <CODE>b1</CODE> nor <CODE>b2</CODE> is TRUE,
* return <CODE>true</CODE>.
* <LI>Otherwise, return <CODE>false</CODE>.
* </OL>
* <p/>
* This method produces the exact logically inverted result as the
* areDifferent(Boolean, Boolean) method.<P>
*/
public static final boolean areBooleansEqual(Boolean b1, Boolean b2) {
// !jwetherb treat NULL the same as Boolean.FALSE
return (b1 == Boolean.TRUE && b2 == Boolean.TRUE) ||
(b1 != Boolean.TRUE && b2 != Boolean.TRUE);
}
/**
* This is a utility method that compares two objects when one or
* both of the objects might be <CODE>null</CODE>. The result
* returned by this method is determined as follows:
* <OL>
* <LI>If <CODE>o1</CODE> and <CODE>o2</CODE> are the same object
* according to the <CODE>==</CODE> operator, return
* <CODE>false</CODE>.
* <LI>Otherwise, if either <CODE>o1</CODE> or <CODE>o2</CODE> is
* <CODE>null</CODE>, return <CODE>true</CODE>.
* <LI>Otherwise, return <CODE>!o1.equals(o2)</CODE>.
* </OL>
* <p/>
* This method produces the exact logically inverted result as the
* {@link #areEqual(Object, Object)} method.<P>
* <p/>
* For array types, one of the <CODE>equals</CODE> methods in
* {@link java.util.Arrays} should be used instead of this method.
* Note that arrays with more than one dimension will require some
* custom code in order to implement <CODE>equals</CODE> properly.
*/
public static final boolean areDifferent(Object o1, Object o2) {
return !areEqual(o1, o2);
}
/**
* This is a utility method that compares two Booleans when one or
* both of the objects might be <CODE>null</CODE> The result of
* this method is determined as follows:
* <OL>
* <LI>If <CODE>b1</CODE> and <CODE>b2</CODE> are both TRUE or
* neither <CODE>b1</CODE> nor <CODE>b2</CODE> is TRUE,
* return <CODE>false</CODE>.
* <LI>Otherwise, return <CODE>true</CODE>.
* </OL>
* <p/>
* This method produces the exact logically inverted result as the
* {@link #areBooleansEqual(Boolean, Boolean)} method.<P>
*/
public static final boolean areBooleansDifferent(Boolean b1, Boolean b2) {
return !areBooleansEqual(b1, b2);
}
/**
* Returns <CODE>true</CODE> if the specified array is not null
* and contains a non-null element. Returns <CODE>false</CODE>
* if the array is null or if all the array elements are null.
*/
public static final boolean hasNonNullElement(Object[] array) {
if (array != null) {
final int n = array.length;
for (int i = 0; i < n; i++) {
if (array[i] != null) {
return true;
}
}
}
return false;
}
/**
* Returns a single string that is the concatenation of all the
* strings in the specified string array. A single space is
* put between each string array element. Null array elements
* are skipped. If the array itself is null, the empty string
* is returned. This method is guaranteed to return a non-null
* value, if no expections are thrown.
*/
public static final String concat(String[] strs) {
return concat(strs, " "); //NOTRANS
}
/**
* Returns a single string that is the concatenation of all the
* strings in the specified string array. The strings are separated
* by the specified delimiter. Null array elements are skipped. If
* the array itself is null, the empty string is returned. This
* method is guaranteed to return a non-null value, if no expections
* are thrown.
*/
public static final String concat(String[] strs, String delim) {
if (strs != null) {
final StringBuffer buf = new StringBuffer();
final int n = strs.length;
for (int i = 0; i < n; i++) {
final String str = strs[i];
if (str != null) {
buf.append(str).append(delim);
}
}
final int length = buf.length();
if (length > 0) {
// Trim trailing space.
buf.setLength(length - 1);
}
return buf.toString();
}
else {
return ""; // NOTRANS
}
}
/**
* Returns <CODE>true</CODE> if the specified {@link String} is not
* <CODE>null</CODE> and has a length greater than zero. This is
* a very frequently occurring check.
*/
public static final boolean hasLength(String s) {
return (s != null && s.length() > 0);
}
/**
* Returns <CODE>null</CODE> if the specified string is empty or
* <CODE>null</CODE>. Otherwise the string itself is returned.
*/
public static final String nullifyIfEmpty(String s) {
return hasLength(s) ? s : null;
}
/**
* Returns <CODE>null</CODE> if the specified object is null
* or if its <CODE>toString()</CODE> representation is empty.
* Otherwise, the <CODE>toString()</CODE> representation of the
* object itself is returned.
*/
public static final String nullifyingToString(Object o) {
return o != null ? nullifyIfEmpty(o.toString()) : null;
}
/**
* Determines if a string has been changed.
*
* @param oldString is the initial value of the String
* @param newString is the new value of the String
* @return true If both oldString and newString are null or if they are
* both not null and equal to each other. Otherwise returns false.
*/
public static boolean hasStringChanged(String oldString, String newString) {
if (oldString == null && newString == null) {
return false;
}
else if ((oldString == null && newString != null)
|| (oldString != null && newString == null)) {
return true;
}
else {
return !oldString.equals(newString);
}
}
/**
* Returns a formatted String from time.
*
* @param diff the amount of elapsed time.
* @return the formatte String.
*/
public static String getTimeFromLong(long diff) {
final String HOURS = "h";
final String MINUTES = "min";
final String SECONDS = "sec";
final long MS_IN_A_DAY = 1000 * 60 * 60 * 24;
final long MS_IN_AN_HOUR = 1000 * 60 * 60;
final long MS_IN_A_MINUTE = 1000 * 60;
final long MS_IN_A_SECOND = 1000;
Date currentTime = new Date();
long numDays = diff / MS_IN_A_DAY;
diff = diff % MS_IN_A_DAY;
long numHours = diff / MS_IN_AN_HOUR;
diff = diff % MS_IN_AN_HOUR;
long numMinutes = diff / MS_IN_A_MINUTE;
diff = diff % MS_IN_A_MINUTE;
long numSeconds = diff / MS_IN_A_SECOND;
diff = diff % MS_IN_A_SECOND;
long numMilliseconds = diff;
StringBuffer buf = new StringBuffer();
if (numHours > 0) {
buf.append(numHours + " " + HOURS + ", ");
}
if (numMinutes > 0) {
buf.append(numMinutes + " " + MINUTES);
}
//buf.append(numSeconds + " " + SECONDS);
String result = buf.toString();
if (numMinutes < 1) {
result = "< 1 minute";
}
return result;
}
/**
* Build a List of all elements in an Iterator.
*/
public static List iteratorAsList(Iterator i) {
ArrayList list = new ArrayList(10);
while (i.hasNext()) {
list.add(i.next());
}
return list;
}
/**
* Creates an Iterator that is the reverse of a ListIterator.
*/
public static Iterator reverseListIterator(ListIterator i) {
return new ReverseListIterator(i);
}
}
/**
* An Iterator that is the reverse of a ListIterator.
*/
class ReverseListIterator implements Iterator {
private ListIterator listIterator;
ReverseListIterator(ListIterator i) {
listIterator = i;
while (listIterator.hasNext()) listIterator.next();
}
public boolean hasNext() {
return listIterator.hasPrevious();
}
public Object next() {
return listIterator.previous();
}
public void remove() {
listIterator.remove();
}
}
/**
* $Revision: 4005 $
* $Date: 2006-06-16 08:58:27 -0700 (Fri, 16 Jun 2006) $
*
* Copyright (C) 2008 Jive Software. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution, or a commercial license
* agreement with Jive.
*/
package org.jivesoftware.openfire.plugin.spark;
import java.util.Date;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Performs tasks using worker threads. It also allows tasks to be scheduled to be
* run at future dates. This class mimics relevant methods in both
* {@link java.util.concurrent.ExecutorService} and {@link java.util.Timer}. Any {@link java.util.TimerTask} that's
* scheduled to be run in the future will automatically be run using the thread
* executor's thread pool. This means that the standard restriction that TimerTasks
* should run quickly does not apply.
*
* @author Matt Tucker
*/
public class TaskEngine {
private static TaskEngine instance = new TaskEngine();
/**
* Returns a task engine instance (singleton).
*
* @return a task engine.
*/
public static TaskEngine getInstance() {
return instance;
}
private Timer timer;
private ExecutorService executor;
private Map<TimerTask, TimerTaskWrapper> wrappedTasks = new ConcurrentHashMap<TimerTask, TimerTaskWrapper>();
/**
* Constructs a new task engine.
*/
private TaskEngine() {
timer = new Timer("timer-openfire", true);
executor = Executors.newCachedThreadPool(new ThreadFactory() {
final AtomicInteger threadNumber = new AtomicInteger(1);
public Thread newThread(Runnable runnable) {
// Use our own naming scheme for the threads.
Thread thread = new Thread(Thread.currentThread().getThreadGroup(), runnable,
"pool-openfire" + threadNumber.getAndIncrement(), 0);
// Make workers daemon threads.
thread.setDaemon(true);
if (thread.getPriority() != Thread.NORM_PRIORITY) {
thread.setPriority(Thread.NORM_PRIORITY);
}
return thread;
}
});
}
/**
* Submits a Runnable task for execution and returns a Future
* representing that task.
*
* @param task the task to submit.
* @return a Future representing pending completion of the task,
* and whose <tt>get()</tt> method will return <tt>null</tt>
* upon completion.
* @throws java.util.concurrent.RejectedExecutionException if task cannot be scheduled
* for execution.
* @throws NullPointerException if task null.
*/
public Future<?> submit(Runnable task) {
return executor.submit(task);
}
/**
* Schedules the specified task for execution after the specified delay.
*
* @param task task to be scheduled.
* @param delay delay in milliseconds before task is to be executed.
* @throws IllegalArgumentException if <tt>delay</tt> is negative, or
* <tt>delay + System.currentTimeMillis()</tt> is negative.
* @throws IllegalStateException if task was already scheduled or
* cancelled, or timer was cancelled.
*/
public void schedule(TimerTask task, long delay) {
timer.schedule(new TimerTaskWrapper(task), delay);
}
/**
* Schedules the specified task for execution at the specified time. If
* the time is in the past, the task is scheduled for immediate execution.
*
* @param task task to be scheduled.
* @param time time at which task is to be executed.
* @throws IllegalArgumentException if <tt>time.getTime()</tt> is negative.
* @throws IllegalStateException if task was already scheduled or
* cancelled, timer was cancelled, or timer thread terminated.
*/
public void schedule(TimerTask task, Date time) {
timer.schedule(new TimerTaskWrapper(task), time);
}
/**
* Schedules the specified task for repeated <i>fixed-delay execution</i>,
* beginning after the specified delay. Subsequent executions take place
* at approximately regular intervals separated by the specified period.
*
* <p>In fixed-delay execution, each execution is scheduled relative to
* the actual execution time of the previous execution. If an execution
* is delayed for any reason (such as garbage collection or other
* background activity), subsequent executions will be delayed as well.
* In the long run, the frequency of execution will generally be slightly
* lower than the reciprocal of the specified period (assuming the system
* clock underlying <tt>Object.wait(long)</tt> is accurate).
*
* <p>Fixed-delay execution is appropriate for recurring activities
* that require "smoothness." In other words, it is appropriate for
* activities where it is more important to keep the frequency accurate
* in the short run than in the long run. This includes most animation
* tasks, such as blinking a cursor at regular intervals. It also includes
* tasks wherein regular activity is performed in response to human
* input, such as automatically repeating a character as long as a key
* is held down.
*
* @param task task to be scheduled.
* @param delay delay in milliseconds before task is to be executed.
* @param period time in milliseconds between successive task executions.
* @throws IllegalArgumentException if <tt>delay</tt> is negative, or
* <tt>delay + System.currentTimeMillis()</tt> is negative.
* @throws IllegalStateException if task was already scheduled or
* cancelled, timer was cancelled, or timer thread terminated.
*/
public void schedule(TimerTask task, long delay, long period) {
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
wrappedTasks.put(task, taskWrapper);
timer.schedule(taskWrapper, delay, period);
}
/**
* Schedules the specified task for repeated <i>fixed-delay execution</i>,
* beginning at the specified time. Subsequent executions take place at
* approximately regular intervals, separated by the specified period.
*
* <p>In fixed-delay execution, each execution is scheduled relative to
* the actual execution time of the previous execution. If an execution
* is delayed for any reason (such as garbage collection or other
* background activity), subsequent executions will be delayed as well.
* In the long run, the frequency of execution will generally be slightly
* lower than the reciprocal of the specified period (assuming the system
* clock underlying <tt>Object.wait(long)</tt> is accurate).
*
* <p>Fixed-delay execution is appropriate for recurring activities
* that require "smoothness." In other words, it is appropriate for
* activities where it is more important to keep the frequency accurate
* in the short run than in the long run. This includes most animation
* tasks, such as blinking a cursor at regular intervals. It also includes
* tasks wherein regular activity is performed in response to human
* input, such as automatically repeating a character as long as a key
* is held down.
*
* @param task task to be scheduled.
* @param firstTime First time at which task is to be executed.
* @param period time in milliseconds between successive task executions.
* @throws IllegalArgumentException if <tt>time.getTime()</tt> is negative.
* @throws IllegalStateException if task was already scheduled or
* cancelled, timer was cancelled, or timer thread terminated.
*/
public void schedule(TimerTask task, Date firstTime, long period) {
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
wrappedTasks.put(task, taskWrapper);
timer.schedule(taskWrapper, firstTime, period);
}
/**
* Schedules the specified task for repeated <i>fixed-rate execution</i>,
* beginning after the specified delay. Subsequent executions take place
* at approximately regular intervals, separated by the specified period.
*
* <p>In fixed-rate execution, each execution is scheduled relative to the
* scheduled execution time of the initial execution. If an execution is
* delayed for any reason (such as garbage collection or other background
* activity), two or more executions will occur in rapid succession to
* "catch up." In the long run, the frequency of execution will be
* exactly the reciprocal of the specified period (assuming the system
* clock underlying <tt>Object.wait(long)</tt> is accurate).
*
* <p>Fixed-rate execution is appropriate for recurring activities that
* are sensitive to <i>absolute</i> time, such as ringing a chime every
* hour on the hour, or running scheduled maintenance every day at a
* particular time. It is also appropriate for recurring activities
* where the total time to perform a fixed number of executions is
* important, such as a countdown timer that ticks once every second for
* ten seconds. Finally, fixed-rate execution is appropriate for
* scheduling multiple repeating timer tasks that must remain synchronized
* with respect to one another.
*
* @param task task to be scheduled.
* @param delay delay in milliseconds before task is to be executed.
* @param period time in milliseconds between successive task executions.
* @throws IllegalArgumentException if <tt>delay</tt> is negative, or
* <tt>delay + System.currentTimeMillis()</tt> is negative.
* @throws IllegalStateException if task was already scheduled or
* cancelled, timer was cancelled, or timer thread terminated.
*/
public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
wrappedTasks.put(task, taskWrapper);
timer.scheduleAtFixedRate(taskWrapper, delay, period);
}
/**
* Schedules the specified task for repeated <i>fixed-rate execution</i>,
* beginning at the specified time. Subsequent executions take place at
* approximately regular intervals, separated by the specified period.
*
* <p>In fixed-rate execution, each execution is scheduled relative to the
* scheduled execution time of the initial execution. If an execution is
* delayed for any reason (such as garbage collection or other background
* activity), two or more executions will occur in rapid succession to
* "catch up." In the long run, the frequency of execution will be
* exactly the reciprocal of the specified period (assuming the system
* clock underlying <tt>Object.wait(long)</tt> is accurate).
*
* <p>Fixed-rate execution is appropriate for recurring activities that
* are sensitive to <i>absolute</i> time, such as ringing a chime every
* hour on the hour, or running scheduled maintenance every day at a
* particular time. It is also appropriate for recurring activities
* where the total time to perform a fixed number of executions is
* important, such as a countdown timer that ticks once every second for
* ten seconds. Finally, fixed-rate execution is appropriate for
* scheduling multiple repeating timer tasks that must remain synchronized
* with respect to one another.
*
* @param task task to be scheduled.
* @param firstTime First time at which task is to be executed.
* @param period time in milliseconds between successive task executions.
* @throws IllegalArgumentException if <tt>time.getTime()</tt> is negative.
* @throws IllegalStateException if task was already scheduled or
* cancelled, timer was cancelled, or timer thread terminated.
*/
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) {
TimerTaskWrapper taskWrapper = new TimerTaskWrapper(task);
wrappedTasks.put(task, taskWrapper);
timer.scheduleAtFixedRate(taskWrapper, firstTime, period);
}
/**
* Cancels the execution of a scheduled task. {@link java.util.TimerTask#cancel()}
*
* @param task the scheduled task to cancel.
*/
public void cancelScheduledTask(TimerTask task) {
TaskEngine.TimerTaskWrapper taskWrapper = wrappedTasks.remove(task);
if (taskWrapper != null) {
taskWrapper.cancel();
}
}
/**
* Shuts down the task engine service.
*/
public void shutdown() {
if (executor != null) {
executor.shutdownNow();
executor = null;
}
if (timer != null) {
timer.cancel();
timer = null;
}
}
/**
* Wrapper class for a standard TimerTask. It simply executes the TimerTask
* using the executor's thread pool.
*/
private class TimerTaskWrapper extends TimerTask {
private TimerTask task;
public TimerTaskWrapper(TimerTask task) {
this.task = task;
}
public void run() {
executor.submit(task);
}
}
}
\ No newline at end of file
/**
* $RCSfile: $
* $Revision: $
* $Date: $
*
* Copyright (C) 2006 Jive Software. All rights reserved.
* This software is the proprietary information of Jive Software. Use is subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark.manager;
import org.jivesoftware.openfire.filetransfer.*;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.util.JiveGlobals;
/**
*
*/
public class FileTransferFilterManager {
/**
* The JiveProperty relating to whether or not file transfer is currently enabled. If file
* transfer is disabled all known file transfer related packets are blocked, it also goes
* with out saying that the file transfer proxy is then disabled.
*/
static final String JIVEPROPERTY_FILE_TRANSFER_ENABLED = "xmpp.filetransfer.enabled";
/**
* Whether or not the file transfer is enabled by default.
*/
static final boolean DEFAULT_IS_FILE_TRANSFER_ENABLED = true;
private org.jivesoftware.openfire.filetransfer.FileTransferManager manager;
private TransferInterceptor transferInterceptor;
public FileTransferFilterManager()
{
this.manager = XMPPServer.getInstance().getFileTransferManager();
this.transferInterceptor = new TransferInterceptor();
}
public void start() {
manager.addFileTransferInterceptor(transferInterceptor);
}
public void stop() {
manager.removeFileTransferInterceptor(transferInterceptor);
}
public void enableFileTransfer(boolean isEnabled) {
JiveGlobals.setProperty(JIVEPROPERTY_FILE_TRANSFER_ENABLED, Boolean.toString(isEnabled));
}
public boolean isFileTransferEnabled() {
return JiveGlobals.getBooleanProperty(JIVEPROPERTY_FILE_TRANSFER_ENABLED,
DEFAULT_IS_FILE_TRANSFER_ENABLED);
}
private class TransferInterceptor implements FileTransferInterceptor {
public void interceptFileTransfer(FileTransfer transfer, boolean isReady)
throws FileTransferRejectedException
{
if(!isFileTransferEnabled()) {
throw new FileTransferRejectedException();
}
}
}
}
\ No newline at end of file
/**
* $RCSfile: ,v $
* $Revision: 1.0 $
* $Date: 2005/05/25 04:20:03 $
*
* Copyright (C) 1999-2005 Jive Software. All rights reserved.
*
* This software is the proprietary information of Jive Software. Use is
subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark.manager;
import org.jivesoftware.admin.AuthCheckFilter;
import org.jivesoftware.util.JiveGlobals;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Provides support for downloading the Jive Spark IM client.
* (<a href="http://www.igniterealtime.org/projects/spark/index.jsp">Spark</a>).<p>
* <p/>
*
* @author Derek DeMoro
*/
public class SparkDownloadServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
AuthCheckFilter.addExclude("enterprise/getspark");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Handle Version Request. Only handle windows and mac version at this time.
final String clientBuild = request.getParameter("client");
final String os = request.getParameter("os");
if (clientBuild != null) {
sendClientBuild(response, clientBuild);
}
else {
File buildDir = new File(JiveGlobals.getHomeDirectory(), "enterprise/spark");
if (!buildDir.exists()) {
buildDir.mkdirs();
}
final List<String> fileList = new ArrayList<String>();
File[] list = buildDir.listFiles();
int no = list != null ? list.length : 0;
for (int i = 0; i < no; i++) {
File clientFile = list[i];
if (clientFile.getName().endsWith(".exe") && "windows".equals(os)) {
fileList.add(clientFile.getName());
}
else if (clientFile.getName().endsWith(".dmg") && "mac".equals(os)) {
fileList.add(clientFile.getName());
}
else if(clientFile.getName().endsWith(".tar.gz") && "linux".equals(os)){
fileList.add(clientFile.getName());
}
}
Collections.sort(fileList);
if(fileList.size() > 0){
int size = fileList.size();
String fileName = fileList.get(size - 1);
sendClientBuild(response, fileName);
}
}
}
private void sendClientBuild(HttpServletResponse resp, final String clientBuild) throws IOException {
// Determine release location. All builds should be put into the document_root/releases directory
// and be named appropriatly (ex. spark_1_0_0.exe, spark_1_0_1.dmg)
File clientFile = new File(JiveGlobals.getHomeDirectory(), "enterprise/spark/" + clientBuild);
// Set content size
resp.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition", "attachment; filename=" + clientBuild);
resp.setContentLength((int)clientFile.length());
// Open the file and output streams
FileInputStream in = new FileInputStream(clientFile);
OutputStream out = resp.getOutputStream();
// Copy the contents of the file to the output stream
byte[] buf = new byte[1024];
int count;
while ((count = in.read(buf)) >= 0) {
out.write(buf, 0, count);
}
in.close();
out.close();
}
}
/**
* $RCSfile: ,v $
* $Revision: 1.0 $
* $Date: 2005/05/25 04:20:03 $
*
* Copyright (C) 1999-2005 Jive Software. All rights reserved.
*
* This software is the proprietary information of Jive Software. Use is
subject to license terms.
*/
package org.jivesoftware.openfire.plugin.spark.manager;
import org.dom4j.Element;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.openfire.XMPPServer;
import org.xmpp.component.Component;
import org.xmpp.component.ComponentException;
import org.xmpp.component.ComponentManager;
import org.xmpp.component.ComponentManagerFactory;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import org.xmpp.packet.PacketError;
import java.io.File;
/**
* Provides support for server administrators to control the global updating of the Jive Spark IM client.
* (<a href="http://www.igniterealtime.org/projects/spark/index.jsp">Spark</a>).<p>
* <p/>
* The basic functionality is to query the server for the latest client
* version and return that information. The version comparison is left to
* the client itself, so as to keep the SparkVersionManager simple.
* <p/>
*
* @author Derek DeMoro
*/
public class SparkVersionManager implements Component {
private ComponentManager componentManager;
public static String SERVICE_NAME = "updater";
/**
* Empty constructor for initializing.
*/
public SparkVersionManager() {
// Initialize ComponentManager
componentManager = ComponentManagerFactory.getComponentManager();
}
/**
* Returns the name of this plugin.
*
* @return the name of this plugin.
*/
public String getName() {
return "Spark Version Manager";
}
/**
* Returns a brief description of this plugin.
*
* @return a brief description of this plugin.
*/
public String getDescription() {
return "Allow admins to control the updating of the Spark IM Client.";
}
public void processPacket(Packet packet) {
if (packet instanceof IQ) {
IQ iqPacket = (IQ)packet;
if (IQ.Type.get == iqPacket.getType()) {
Element childElement = (iqPacket).getChildElement();
String namespace = null;
if (childElement != null) {
namespace = childElement.getNamespaceURI();
}
// Handle any disco info requests.
if ("http://jabber.org/protocol/disco#info".equals(namespace)) {
handleDiscoInfo(iqPacket);
}
// Handle any disco item requests.
else if ("http://jabber.org/protocol/disco#items".equals(namespace)) {
handleDiscoItems(iqPacket);
}
// Handle a jabber spark request.
else if ("jabber:iq:spark".equals(namespace)) {
handleSparkIQ(iqPacket);
}
}
else if (IQ.Type.error == iqPacket.getType() || IQ.Type.result == iqPacket.getType()) {
// Ignore these packets
}
else {
// Return error since this is an unknown service request
IQ reply = IQ.createResultIQ(iqPacket);
reply.setError(PacketError.Condition.service_unavailable);
sendPacket(reply);
}
}
}
private void handleSparkIQ(IQ packet) {
IQ reply;
Element iq = packet.getChildElement();
// Define default values
String os = iq.element("os").getText();
reply = IQ.createResultIQ(packet);
// Handle Invalid Requests
if (os == null || (!os.equals("windows") && !os.equals("mac") && !os.equals("linux"))) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.not_acceptable));
sendPacket(reply);
return;
}
Element sparkElement = reply.setChildElement("query", "jabber:iq:spark");
String client = null;
// Handle Windows clients
if (os.equals("windows")) {
client = JiveGlobals.getProperty("spark.windows.client");
}
// Handle Mac clients.
else if (os.equals("mac")) {
client = JiveGlobals.getProperty("spark.mac.client");
}
// Handle Linux Client.
else if (os.equals("linux")) {
client = JiveGlobals.getProperty("spark.linux.client");
}
if (client != null) {
int index = client.indexOf("_");
// Add version number
String versionNumber = client.substring(index + 1);
int indexOfPeriod = versionNumber.indexOf(".");
versionNumber = versionNumber.substring(0, indexOfPeriod);
versionNumber = versionNumber.replaceAll("_", ".");
sparkElement.addElement("version").setText(versionNumber);
// Add updated time.
File clientFile = new File(JiveGlobals.getHomeDirectory(), "enterprise/spark/" + client);
if (!clientFile.exists()) {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
sendPacket(reply);
return;
}
long updatedTime = clientFile.lastModified();
sparkElement.addElement("updatedTime").setText(Long.toString(updatedTime));
// Add download url
String downloadURL = JiveGlobals.getProperty("spark.client.downloadURL");
String server = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
downloadURL = downloadURL.replace("127.0.0.1", server);
sparkElement.addElement("downloadURL").setText(downloadURL + "?client=" + client);
String displayMessage = JiveGlobals.getProperty("spark.client.displayMessage");
if (displayMessage != null && displayMessage.trim().length() > 0) {
sparkElement.addElement("displayMessage").setText(displayMessage);
}
}
else {
reply.setChildElement(packet.getChildElement().createCopy());
reply.setError(new PacketError(PacketError.Condition.item_not_found));
sendPacket(reply);
return;
}
sendPacket(reply);
}
private void handleDiscoItems(IQ packet) {
IQ replyPacket = IQ.createResultIQ(packet);
replyPacket.setChildElement("query", "http://jabber.org/protocol/disco#items");
sendPacket(replyPacket);
}
private void handleDiscoInfo(IQ packet) {
IQ replyPacket = IQ.createResultIQ(packet);
Element responseElement =
replyPacket.setChildElement("query", "http://jabber.org/protocol/disco#info");
Element identity = responseElement.addElement("identity");
identity.addAttribute("category", "updater");
identity.addAttribute("type", "text");
identity.addAttribute("name", "Spark Updater");
responseElement.addElement("feature").addAttribute("var", "jabber:iq:updater");
sendPacket(replyPacket);
}
public void initialize(JID jid, ComponentManager componentManager) throws ComponentException {
// Do nothing.
}
public void start() {
// Do nothing
}
public void shutdown() {
// Do nothing.
}
private void sendPacket(Packet packet) {
try {
componentManager.sendPacket(this, packet);
}
catch (ComponentException e) {
componentManager.getLog().error(e);
}
}
}
<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- Servlets -->
<servlet>
<servlet-name>SparkDownload</servlet-name>
<servlet-class>org.jivesoftware.openfire.plugin.spark.manager.SparkDownloadServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Servlet mappings -->
<servlet-mapping>
<servlet-name>SparkDownload</servlet-name>
<url-pattern>/getspark</url-pattern>
</servlet-mapping>
</web-app>
<%@ page import="org.jivesoftware.openfire.plugin.spark.manager.FileTransferFilterManager" %>
<%@ page import="org.jivesoftware.util.JiveGlobals"%>
<%@ page import="org.jivesoftware.openfire.XMPPServer" %>
<%@ page import="org.jivesoftware.openfire.plugin.ClientControlPlugin" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%
String broadcastEnabledString = JiveGlobals.getProperty("broadcast.enabled", "true");
String fileTransferString = JiveGlobals.getProperty("transfer.enabled", "true");
boolean isMucEnabled = XMPPServer.getInstance().getMultiUserChatServer().isServiceEnabled();
String musEnabledString = JiveGlobals.getProperty("muc.enabled", "true");
String vcardEnabledString = JiveGlobals.getProperty("vcard.enabled", "true");
boolean submit = request.getParameter("submit") != null;
if (submit) {
broadcastEnabledString = request.getParameter("broadcastEnabled");
fileTransferString = request.getParameter("transferEnabled");
musEnabledString = request.getParameter("mucEnabled");
vcardEnabledString = request.getParameter("vcardEnabled");
JiveGlobals.setProperty("broadcast.enabled", broadcastEnabledString);
JiveGlobals.setProperty("transfer.enabled", fileTransferString);
boolean mucEnabled = Boolean.parseBoolean(musEnabledString);
XMPPServer.getInstance().getMultiUserChatServer().enableService(mucEnabled, true);
JiveGlobals.setProperty("vcard.enabled", vcardEnabledString);
}
boolean broadcastEnabled = Boolean.parseBoolean(broadcastEnabledString);
boolean transferEnabled = Boolean.parseBoolean(fileTransferString);
boolean mucEnabled = XMPPServer.getInstance().getMultiUserChatServer().isServiceEnabled();
boolean vcardEnabled = Boolean.parseBoolean(vcardEnabledString);
// Enable File Transfer in the system.
ClientControlPlugin plugin = (ClientControlPlugin) XMPPServer.getInstance()
.getPluginManager().getPlugin("clientcontrol");
FileTransferFilterManager manager = plugin.getFileTransferFilterManager();
manager.enableFileTransfer(transferEnabled);
%>
<html>
<head>
<title><fmt:message key="client.features.title"/></title>
<meta name="pageID" content="client-features"/>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<% if (submit) { %>
<div class="success">
<fmt:message key="client.features.update.features"/>
</div>
<br>
<% }%>
<p>
<fmt:message key="client.features.info"/>
</p>
<form name="f" action="client-features.jsp" method="post">
<table class="jive-table" cellspacing="0" width="600">
<th><fmt:message key="client.feature"/></th>
<th><fmt:message key="client.features.enabled"/></th>
<th><fmt:message key="client.features.disabled"/></th>
<tr>
<td><b><fmt:message key="client.features.broadcasting" /></b> - <fmt:message key="client.features.spark.only" /><br/><span class="jive-description">
<fmt:message key="client.features.broadcasting.description" />
</span></td>
<td width="1%" nowrap>
<input type="radio" name="broadcastEnabled" value="true" <%= broadcastEnabled ? "checked" : "" %> />
</td>
<td width="1%" nowrap>
<input type="radio" name="broadcastEnabled" value="false" <%= !broadcastEnabled ? "checked" : "" %> />
</td>
</tr>
<tr>
<td><b><fmt:message key="client.features.filetransfer" /></b><br/><span class="jive-description">
<fmt:message key="client.features.filetransfer.description" />
</span></td>
<td width="1%" nowrap>
<input type="radio" name="transferEnabled" value="true" <%= transferEnabled ? "checked" : "" %> />
</td>
<td width="1%" nowrap>
<input type="radio" name="transferEnabled" value="false" <%= !transferEnabled ? "checked" : "" %> />
</td>
</tr>
<tr>
<td><b><fmt:message key="client.features.vcard" /></b> - <fmt:message key="client.features.spark.only" /><br/><span class="jive-description">
<fmt:message key="client.features.vcard.description" />
</span></td>
<td width="1%" nowrap>
<input type="radio" name="vcardEnabled" value="true" <%= vcardEnabled ? "checked" : "" %> />
</td>
<td width="1%" nowrap>
<input type="radio" name="vcardEnabled" value="false" <%= !vcardEnabled ? "checked" : "" %> />
</td>
</tr>
<tr>
<td><b><fmt:message key="client.features.groupchat" /></b><br/><span class="jive-description">
<fmt:message key="client.features.groupchat.description" />
</span></td>
<td width="1%" nowrap>
<input type="radio" name="mucEnabled" value="true" <%= mucEnabled ? "checked" : "" %> />
</td>
<td width="1%" nowrap>
<input type="radio" name="mucEnabled" value="false" <%= !mucEnabled ? "checked" : "" %> />
</td>
</tr>
</table>
<br/>
<input type="submit" name="submit" value="<fmt:message key="client.features.save.settings" />" />
</form>
</body>
</html>
\ No newline at end of file
<%@ page errorPage="/error.jsp" import="org.jivesoftware.openfire.plugin.ClientControlPlugin" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.Bookmark" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.BookmarkManager" %>
<%@ page import="org.jivesoftware.util.Log" %>
<%@ page import="org.jivesoftware.openfire.XMPPServer" %>
<%@ page import="org.jivesoftware.openfire.muc.MUCRoom" %>
<%@ page import="org.jivesoftware.openfire.muc.MultiUserChatServer" %>
<%@ page import="java.util.Collection" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%
String bookmarkID = request.getParameter("bookmarkID");
Bookmark bookmark = new Bookmark(Long.parseLong(bookmarkID));
boolean delete = request.getParameter("delete") != null;
if (delete && bookmarkID != null) {
BookmarkManager.deleteBookmark(Long.parseLong(bookmarkID));
if(bookmark.getType() == Bookmark.Type.group_chat){
response.sendRedirect("groupchat-bookmarks.jsp?delete=true");
}
else {
response.sendRedirect("url-bookmarks.jsp?delete=true");
}
return;
}
%>
<html>
<head>
<title><fmt:message key="bookmark.delete.confirm" /></title>
<meta name="pageID" content="<%= bookmark.getType() == Bookmark.Type.group_chat ? "groupchat-bookmarks" : "url-bookmarks"%>"/>
<script type="text/javascript">
</script>
<style type="text/css">
.field-label {
font-size: 11px;
font-weight: bold;
}
.field-text {
font-size: 12px;
font-family: verdana;
}
.div-border {
border: 1px;
border-color: #ccc;
border-style: dotted;
}
</style>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<!-- Create URL Bookmark -->
<p>
<fmt:message key="bookmark.delete.confirm.prompt" />
</p>
<% if (bookmark.getType() == Bookmark.Type.url) { %>
<form name="urlForm" action="confirm-bookmark-delete.jsp" method="post">
<table class="div-border">
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.url.urlname" /></b></td>
<td><%= bookmark.getName()%>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.url.url" /></b></td>
<td><%= bookmark.getValue()%></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.url.users" /></b></td>
<td><%= bookmark.getUsers()%>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.url.groups" /></b></td>
<td><%= bookmark.getGroups()%>
</tr>
<tr><td></td>
<td>
<input type="submit" name="delete" value="<fmt:message key="bookmark.delete.url.submit" />"/>&nbsp;
<input type="button" value="<fmt:message key="bookmark.delete.url.cancel" />"
onclick="window.location.href='url-bookmarks.jsp'; return false;">
</td>
</tr>
</table>
<input type="hidden" name="bookmarkID" value="<%= bookmarkID%>"/>
</form>
<% }
else { %>
<form name="f" action="confirm-bookmark-delete.jsp" method="post">
<table class="div-border" width="50%">
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.chat.groupname" /></b></td>
<td class="field-text"><%= bookmark.getName()%></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.chat.address" /></b></td>
<td class="field-text"><%= bookmark.getValue()%>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.chat.users" /></b></td>
<td class="field-text"><%= bookmark.isGlobalBookmark() ? "ALL" : getCommaDelimitedList(bookmark.getUsers(), 5)%></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.delete.chat.groups" /></b></td>
<td class="field-text"><%= bookmark.isGlobalBookmark() ? "ALL" : getCommaDelimitedList(bookmark.getGroups(), 5) %></td>
</tr>
<tr>
<td><b><fmt:message key="bookmark.delete.chat.autojoin" /></b></td>
<td><%= bookmark.getProperty("autojoin") != null ? "<img src='/images/check.gif'>" : "&nbsp;"%></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" name="delete" value="<fmt:message key="bookmark.delete.chat.submit" />">
<input type="button" value="<fmt:message key="bookmark.delete.chat.cancel" />"
onclick="window.location.href='groupchat-bookmarks.jsp'; return false;">
</td>
</tr>
</table>
<input type="hidden" name="bookmarkID" value="<%= bookmarkID%>"/>
</form>
<% } %>
</body>
</html>
<%!
/**
* A more elegant string representing all users that this bookmark
* "belongs" to.
*
* @return the string.
*/
public String getCommaDelimitedList(Collection<String> strings, int limit) {
int counter = 0;
StringBuilder buf = new StringBuilder();
for (String string : strings) {
buf.append(string);
buf.append(",");
counter++;
if (counter >= limit) {
break;
}
}
String returnStr = buf.toString();
if (returnStr.endsWith(",")) {
returnStr = returnStr.substring(0, returnStr.length() - 1);
}
return returnStr;
}
public String getJidFromRoomName(String roomName) {
// Load the MultiUserChatServer
XMPPServer xmppServer = XMPPServer.getInstance();
MultiUserChatServer mucServer = xmppServer.getMultiUserChatServer();
MUCRoom room = null;
try {
room = mucServer.getChatRoom(roomName);
}
catch (Exception e) {
Log.error(e);
return null;
}
return "";//Todo. Return actual name. Checking in for file transfer.
}
%>
\ No newline at end of file
<%@ page import="org.jivesoftware.openfire.plugin.spark.Bookmark" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.SparkUtil" %>
<%@ page import="org.jivesoftware.util.Log" %>
<%@ page import="org.jivesoftware.util.ParamUtils" %>
<%@ page import="org.jivesoftware.openfire.XMPPServer" %>
<%@ page import="org.jivesoftware.openfire.muc.MUCRoom" %>
<%@ page import="org.jivesoftware.openfire.muc.MultiUserChatServer" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Collection" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.StringTokenizer" %>
<%@ page import="org.jivesoftware.util.NotFoundException"%>
<%@ page import="org.jivesoftware.util.LocaleUtils"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%
boolean urlType = false;
boolean groupchatType = false;
String type = request.getParameter("type");
if ("url".equals(type)) {
urlType = true;
}
else {
groupchatType = true;
}
boolean edit = request.getParameter("edit") != null;
String bookmarkID = request.getParameter("bookmarkID");
Bookmark editBookmark = null;
if (edit && bookmarkID != null) {
try {
editBookmark = new Bookmark(Long.parseLong(bookmarkID));
}
catch (NotFoundException e) {
Log.error(e);
}
}
Map<String,String> errors = new HashMap<String,String>();
String groupchatName = request.getParameter("groupchatName");
String groupchatJID = request.getParameter("groupchatJID");
boolean autojoin = ParamUtils.getBooleanParameter(request,"autojoin");
String users = request.getParameter("users");
String groups = request.getParameter("groups");
String url = request.getParameter("url");
String urlName = request.getParameter("urlName");
boolean isRSS = ParamUtils.getBooleanParameter(request, "rss", false);
boolean allUsers = ParamUtils.getBooleanParameter(request,"all");
boolean createGroupchat = request.getParameter("createGroupchatBookmark") != null;
boolean createURLBookmark = request.getParameter("createURLBookmark") != null;
boolean submit = false;
if (createGroupchat || createURLBookmark) {
submit = true;
}
if (submit && createURLBookmark) {
if (!SparkUtil.hasLength(url)) {
errors.put("url", LocaleUtils.getLocalizedString("bookmark.url.error", "clientcontrol"));
}
if (!SparkUtil.hasLength(urlName)) {
errors.put("urlName", LocaleUtils.getLocalizedString("bookmark.urlName.error", "clientcontrol"));
}
}
else if (submit && createGroupchat) {
if (!SparkUtil.hasLength(groupchatName)) {
errors.put("groupchatName", LocaleUtils.getLocalizedString("bookmark.groupchat.name.error", "clientcontrol"));
}
if (!SparkUtil.hasLength(groupchatJID) || !groupchatJID.contains("@")) {
errors.put("groupchatJID", LocaleUtils.getLocalizedString("bookmark.groupchat.address.error", "clientcontrol"));
}
}
if (!submit && errors.size() == 0) {
if (editBookmark != null) {
if (editBookmark.getType() == Bookmark.Type.url) {
url = editBookmark.getProperty("url");
urlName = editBookmark.getName();
}
else {
groupchatName = editBookmark.getName();
autojoin = editBookmark.getProperty("autojoin") != null;
groupchatJID = editBookmark.getValue();
}
users = getCommaDelimitedList(editBookmark.getUsers());
groups = getCommaDelimitedList(editBookmark.getGroups());
allUsers = editBookmark.isGlobalBookmark();
isRSS = editBookmark.getProperty("rss") != null;
}
else {
groupchatName = "";
groupchatJID = "";
url = "";
urlName = "";
users = "";
groups = "";
}
}
else {
if ((createURLBookmark || createGroupchat) && errors.size() == 0) {
Bookmark bookmark = null;
if (bookmarkID == null) {
if (createURLBookmark)
bookmark = new Bookmark(Bookmark.Type.url, urlName, url);
if (createGroupchat) {
bookmark = new Bookmark(Bookmark.Type.group_chat, groupchatName, groupchatJID);
}
}
else {
try {
bookmark = new Bookmark(Long.parseLong(bookmarkID));
}
catch (NotFoundException e) {
Log.error(e);
}
if (createURLBookmark) {
bookmark.setName(urlName);
bookmark.setValue(url);
}
else {
bookmark.setName(groupchatName);
bookmark.setValue(groupchatJID);
}
}
List<String> userCollection = new ArrayList<String>();
List<String> groupCollection = new ArrayList<String>();
if (users != null) {
StringTokenizer tkn = new StringTokenizer(users, ",");
while (tkn.hasMoreTokens()) {
userCollection.add(tkn.nextToken());
}
bookmark.setUsers(userCollection);
}
if (groups != null) {
StringTokenizer tkn = new StringTokenizer(groups, ",");
while (tkn.hasMoreTokens()) {
groupCollection.add(tkn.nextToken());
}
bookmark.setGroups(groupCollection);
}
if (allUsers) {
bookmark.setGlobalBookmark(true);
}
else {
bookmark.setGlobalBookmark(false);
}
if (createURLBookmark) {
if (url != null) {
bookmark.setProperty("url", url);
}
if (isRSS) {
bookmark.setProperty("rss", "true");
}
else {
bookmark.deleteProperty("rss");
}
}
else {
if (autojoin) {
bookmark.setProperty("autojoin", "true");
}
else {
bookmark.deleteProperty("autojoin");
}
}
}
}
if (submit && errors.size() == 0) {
if (createURLBookmark) {
response.sendRedirect("url-bookmarks.jsp?urlCreated=true");
return;
}
else if (createGroupchat) {
response.sendRedirect("groupchat-bookmarks.jsp?groupchatCreated=true");
}
}
String description = LocaleUtils.getLocalizedString("bookmark.url.create.description", "clientcontrol");
if (groupchatType) {
description = LocaleUtils.getLocalizedString("bookmark.groupchat.create.description", "clientcontrol");
if(edit){
description = LocaleUtils.getLocalizedString("bookmark.groupchat.edit.description", "clientcontrol");
}
}
else if(edit){
description = LocaleUtils.getLocalizedString("bookmark.url.edit.description", "clientcontrol");
}
%>
<html>
<head>
<title><%= editBookmark != null ? LocaleUtils.getLocalizedString("bookmark.edit", "clientcontrol") : LocaleUtils.getLocalizedString("bookmark.create", "clientcontrol")%></title>
<link rel="stylesheet" type="text/css" href="/style/global.css">
<meta name="pageID" content="<%= groupchatType ? "groupchat-bookmarks" : "url-bookmarks"%>"/>
<script src="/js/prototype.js" type="text/javascript"></script>
<script src="/js/scriptaculous.js" type="text/javascript"></script>
<script type="text/javascript">
function toggleAllElement(ele, users, groups) {
users.disabled = ele.checked;
groups.disabled = ele.checked;
}
function showPicker() {
alert("Not implemented!");
}
function validateForms(form) {
form.users.disabled = form.all.checked;
form.groups.disabled = form.all.checked;
}
</script>
<style type="text/css">
.div-border {
border: 1px;
border-color: #ccc;
border-style: dotted;
}
</style>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<!-- Create URL Bookmark -->
<p>
<%= description%>
</p>
<% if (submit && errors.size() == 0 && createURLBookmark) { %>
<div class="success">
<fmt:message key="bookmark.created" />
</div>
<% } %>
<% if (urlType) { %>
<form id="urlForm" name="urlForm" action="create-bookmark.jsp" method="post">
<table class="div-border" cellpadding="3">
<tr valign="top">
<td><b><fmt:message key="bookmark.url.name" />:</b></td>
<td><input type="text" name="urlName" size="30" value="<%=urlName %>"/><br/>
<% if (errors.get("urlName") != null) { %>
<span class="jive-error-text"><%= errors.get("urlName")%><br/></span>
<% } %>
<span class="jive-description"><fmt:message key="bookmark.url.name.description" /></span></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="bookmark.url" />:</b></td>
<td><input type="text" name="url" size="30" value="<%=url %>"/><br/>
<% if (errors.get("url") != null) { %>
<span class="jive-error-text"><%= errors.get("url")%><br/></span>
<% } %>
<span class="jive-description">eg. http://www.acme.com</span></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="users" />:</b></td>
<td><input type="text" name="users" size="30" value="<%= users%>"/><br/>
<span class="jive-error-text"></span></td>
<!--
<td><img src="images/icon_browse_14x13.gif"/></td><td><a href="javascript:showPicker();"><fmt:message key="bookmark.browse.users" /></a></td>-->
<td><input type="checkbox" name="all" <%= allUsers ? "checked" : "" %> onclick="toggleAllElement(this, document.urlForm.users, document.urlForm.groups);"/>All Users</td>
</tr>
<tr valign="top">
<td><b><fmt:message key="groups" />:</b></td>
<td><input type="text" name="groups" size="30" value="<%= groups %>"/><br/><span
class="jive-error-text"></span></td><!--
<td><img src="images/icon_browse_14x13.gif"/></td><td><a href="javascript:showPicker();"><fmt:message key="bookmark.browse.groups" /></a></td>-->
</tr>
<% if (errors.get("noUsersOrGroups") != null) { %>
<tr>
<td colspan="2" class="jive-error-text"><fmt:message key="bookmark.users.groups.error" /></td>
</tr>
<% } %>
<tr><td><b><fmt:message key="bookmark.create.rss.feed" /></b></td><td><input type="checkbox" name="rss" <%= isRSS ? "checked" : "" %>/></td></tr>
<tr><td></td><td><input type="submit" name="createURLBookmark"
value="<%= editBookmark != null ? LocaleUtils.getLocalizedString("bookmark.save.changes", "clientcontrol") : LocaleUtils.getLocalizedString("create", "clientcontrol") %>"/>
&nbsp;<input type="button" value="<fmt:message key="cancel" />"
onclick="window.location.href='url-bookmarks.jsp'; return false;">
</td>
</tr>
</table>
<input type="hidden" name="type" value="url"/>
<% if (editBookmark != null) { %>
<input type="hidden" name="bookmarkID" value="<%= editBookmark.getBookmarkID()%>"/>
<input type="hidden" name="edit" value="true" />
<% } %>
<script type="text/javascript">
validateForms(document.urlForm);
</script>
</form>
<% }
else { %>
<form name="f" id="f" action="create-bookmark.jsp" method="post">
<table class="div-border" cellpadding="3">
<tr valign="top">
<td><b><fmt:message key="group.chat.bookmark.name" />:</b></td>
<td colspan="3"><input type="text" name="groupchatName" size="40" value="<%= groupchatName %>"/><br/>
<% if (errors.get("groupchatName") != null) { %>
<span class="jive-error-text"><%= errors.get("groupchatName")%><br/></span>
<% } %>
<span class="jive-description">eg. Discussion Room</span></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="group.chat.bookmark.address" />:</b></td>
<td colspan="3"><input type="text" name="groupchatJID" size="40" value="<%= groupchatJID %>"/><br/>
<% if (errors.get("groupchatJID") != null) { %>
<span class="jive-error-text"><%= errors.get("groupchatJID")%><br/></span>
<% } %>
<span class="jive-description">eg. myroom@conference.example.com</span></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="users" />:</b></td>
<td><input type="text" name="users" size="30" value="<%= users%>"/><br/>
<span class="jive-error-text"></span></td>
<!--
<td><img src="images/icon_browse_14x13.gif"/></td><td><a href="javascript:showPicker();"><fmt:message key="bookmark.browse.users" /></a></td>-->
<td><input type="checkbox" name="all" <%= allUsers ? "checked" : "" %> onclick="toggleAllElement(this, document.f.users, document.f.groups);"/><fmt:message key="bookmark.create.all.users" /></td>
</tr>
<tr valign="top">
<td><b><fmt:message key="groups" />:</b></td>
<td><input type="text" name="groups" size="30" value="<%= groups %>"/><br/><span
class="jive-error-text"></span></td>
<!--
<td><img src="images/icon_browse_14x13.gif"/></td><td><a href="javascript:showPicker();"><fmt:message key="bookmark.browse.groups" /></a></td>-->
</tr>
<tr>
<td><b><fmt:message key="group.chat.bookmark.autojoin" />:</b></td><td><input type="checkbox" name="autojoin" <%= autojoin ? "checked" : "" %>/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="createGroupchatBookmark" value="<%= editBookmark != null ? LocaleUtils.getLocalizedString("bookmark.save.changes", "clientcontrol") : LocaleUtils.getLocalizedString("create", "clientcontrol") %>"/>&nbsp;
<input type="button" value="Cancel" onclick="window.location.href='groupchat-bookmarks.jsp'; return false;">
</td>
</tr>
</table>
<input type="hidden" name="type" value="groupchat"/>
<% if (editBookmark != null) { %>
<input type="hidden" name="bookmarkID" value="<%= editBookmark.getBookmarkID()%>"/>
<input type="hidden" name="edit" value="true" />
<% } %>
<script type="text/javascript">
validateForms(document.f);
</script>
</form>
<% } %>
</body>
</html>
<%!
/**
* A more elegant string representing all users that this bookmark
* "belongs" to.
*
* @return the string.
*/
public String getCommaDelimitedList(Collection<String> strings) {
StringBuilder buf = new StringBuilder();
for (String string : strings) {
buf.append(string);
buf.append(",");
}
String returnStr = buf.toString();
if (returnStr.endsWith(",")) {
returnStr = returnStr.substring(0, returnStr.length() - 1);
}
return returnStr;
}
public String getJidFromRoomName(String roomName) {
// Load the MultiUserChatServer
XMPPServer xmppServer = XMPPServer.getInstance();
MultiUserChatServer mucServer = xmppServer.getMultiUserChatServer();
MUCRoom room = null;
try {
room = mucServer.getChatRoom(roomName);
}
catch (Exception e) {
Log.error(e);
return null;
}
return "";//Todo. Return actual name. Checking in for file transfer.
}
%>
<%@ page import="org.jivesoftware.openfire.plugin.spark.Bookmark" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.BookmarkManager" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.SparkUtil" %>
<%@ page import="org.jivesoftware.util.LocaleUtils" %>
<%@ page import="java.util.Collection"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%
boolean bookmarkCreated = request.getParameter("bookmarkCreated") != null;
boolean delete = request.getParameter("delete") != null;
final Collection<Bookmark> bookmarks = BookmarkManager.getBookmarks();
%>
<html>
<head>
<title><fmt:message key="group.chat.bookmark.title" /></title>
<link rel="stylesheet" type="text/css" href="/style/global.css">
<meta name="pageID" content="groupchat-bookmarks"/>
<script src="/js/prototype.js" type="text/javascript"></script>
<script src="/js/scriptaculous.js" type="text/javascript"></script>
<style type="text/css">
.div-border {
border: 1px solid #CCCCCC;
-moz-border-radius: 3px;
}
</style>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<p>
<fmt:message key="group.chat.bookmark.description" />
</p>
<% if (bookmarkCreated) { %>
<div class="success">
<fmt:message key="group.chat.bookmark.created" />
</div>
<%}%>
<% if (delete) { %>
<div class="success">
<fmt:message key="group.chat.bookmark.removed" />
</div>
<% } %>
<br/>
<div class="div-border" style="padding: 12px; width: 95%;">
<table class="jive-table" cellspacing="0" width="100%">
<th><fmt:message key="group.chat.bookmark.name" /></th><th><fmt:message key="group.chat.bookmark.address"/></th><th><fmt:message key="users" /></th><th><fmt:message key="groups" /></th><th><fmt:message key="group.chat.bookmark.autojoin" /></th><th><fmt:message key="options" /></th>
<%
boolean hasBookmarks = false;
for (Bookmark bookmark : bookmarks) {
String users = "";
String groups = "";
if (bookmark.getType() != Bookmark.Type.group_chat) {
continue;
}
else {
hasBookmarks = true;
if (bookmark.isGlobalBookmark()) {
users = "All";
groups = "All";
}
else {
users = bookmark.getUsers().size() + " "+ LocaleUtils.getLocalizedString("group.chat.bookmark.users", "clientcontrol");
groups = bookmark.getGroups().size() + " "+LocaleUtils.getLocalizedString("group.chat.bookmark.groups", "clientcontrol");
}
}
%>
<tr style="border-left: none;">
<td><%= bookmark.getName()%></td>
<td><%= bookmark.getValue()%></td>
<td><%= users%></td>
<td><%= groups%></td>
<td><%= bookmark.getProperty("autojoin") != null ? "<img src='/images/check.gif'>" : "&nbsp;"%></td>
<td>
<a href="create-bookmark.jsp?edit=true&bookmarkID=<%= bookmark.getBookmarkID()%>"><img src="/images/edit-16x16.gif" border="0" width="16" height="16" alt="Edit Bookmark"/></a>
<a href="confirm-bookmark-delete.jsp?bookmarkID=<%= bookmark.getBookmarkID()%>"><img src="/images/delete-16x16.gif" border="0" width="16" height="16" alt="Delete Bookmark"/></a>
</td>
</tr>
<% } %>
<% if (!hasBookmarks) { %>
<tr>
<td colspan="6" align="center"><fmt:message key="group.chat.bookmark.none" /></td>
</tr>
<%} %>
<tr>
<td colspan="6">
<a href="create-bookmark.jsp?type=group_chat"><img src="/images/add-16x16.gif" border="0" align="texttop" style="margin-right: 3px;"/><fmt:message key="group.chat.bookmark.add" /></a>
</td>
</tr>
</table>
</div>
</body>
</html>
<%!
/**
* A more elegant string representing all users that this bookmark
* "belongs" to.
*
* @return the string.
*/
public String getCommaDelimitedList(Collection<String> strings) {
StringBuilder buf = new StringBuilder();
for (String string : strings) {
buf.append(string);
buf.append(",");
}
String returnStr = buf.toString();
if (returnStr.endsWith(",")) {
returnStr = returnStr.substring(0, returnStr.length() - 1);
}
if (!SparkUtil.hasLength(returnStr)) {
returnStr = "&nbsp;";
}
return returnStr;
}
%>
\ No newline at end of file
<%@ page errorPage="/error.jsp" import="org.jivesoftware.util.JiveGlobals" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.StringTokenizer" %>
<%@ page import="org.jivesoftware.openfire.XMPPServer" %>
<%@ page import="org.jivesoftware.openfire.plugin.ClientControlPlugin" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%!
/**
* Enumeration of possible clients.
*/
enum Clients {
Spark("Spark", "spark", "http://www.igniterealtime.org/projects/spark/index.jsp", "images/client-icon_spark.gif"),
Adium("Adium", "libgaim", "http://www.adiumx.com/", "images/client-icon_adium.gif"),
Exodus("Exodus", "exodus", "http://exodus.jabberstudio.org/", "images/client-icon_exodus.gif"),
Gaim("Gaim", "gaim", "http://gaim.sourceforge.net", "images/client-icon_gaim.gif"),
IChat("IChat", "ichat", "http://www.mac.com/1/ichat.html", "images/client-icon_ichat.gif"),
JBother("JBother", "jbother", "http://www.jbother.org/", "images/client-icon_jbother.gif"),
Pandion("Pandion", "pandion", "http://www.pandion.be/", "images/client-icon_pandion.gif"),
PSI("PSI", "psi", "http://psi-im.org", "images/client-icon_psi.gif"),
Trillian("Trillian", "trillian", "http://www.ceruleanstudios.com/", "images/client-icon_trillian.gif");
private String name;
private String version;
private String url;
private String image;
Clients(String name, String version, String url, String image) {
this.name = name;
this.version = version;
this.url = url;
this.image = image;
}
public String getName() {
return name;
}
public String getVersion() {
return version;
}
public String getURL() {
return url;
}
public String getImage(){
return image;
}
}
%>
<%
String clientsAllowed = JiveGlobals.getProperty("clients.allowed", "all");
String otherClientsAllowed = JiveGlobals.getProperty("other.clients.allowed", "");
final List<String> clients = new ArrayList<String>();
final List<String> otherClients = new ArrayList<String>();
StringTokenizer otherTokens = new StringTokenizer(otherClientsAllowed, ",");
while (otherTokens.hasMoreTokens()) {
otherClients.add(otherTokens.nextToken());
}
String other = null;
boolean submit = request.getParameter("submit") != null;
boolean addOther = request.getParameter("addOther") != null;
boolean remove = request.getParameter("removeClient") != null;
if (submit) {
String[] cls = request.getParameterValues("client");
int length = cls != null ? cls.length : 0;
for (int i = 0; i < length; i++) {
clients.add(cls[i]);
}
boolean all = Boolean.valueOf(request.getParameter("all"));
final StringBuilder builder = new StringBuilder();
// Set clients allowed
for (String client : clients) {
builder.append(client);
builder.append(",");
}
// If all clients are allowed, delete the property to enforce the default of
// all clients being allowed.
if (all) {
JiveGlobals.deleteProperty("clients.allowed");
clients.add("all");
}
// Otherw, set the specific set of clients.
else {
JiveGlobals.setProperty("clients.allowed", builder.toString());
}
}
else if (addOther) {
other = request.getParameter("other");
otherTokens = new StringTokenizer(other, ",");
while (otherTokens.hasMoreTokens()) {
otherClients.add(otherTokens.nextToken());
}
persistOtherClients(otherClients);
}
else if (remove) {
String clientToRemove = request.getParameter("removeClient");
otherClients.remove(clientToRemove);
persistOtherClients(otherClients);
}
else {
StringTokenizer tkn = new StringTokenizer(clientsAllowed, ",");
while (tkn.hasMoreTokens()) {
String token = tkn.nextToken();
if (!"all".equals(token)) {
other = token;
}
clients.add(token);
}
}
%>
<html>
<head>
<title><fmt:message key="permitted.client.title"/></title>
<meta name="pageID" content="client-version"/>
<script type="text/javascript" language="javascript" src="scripts/tooltips/domLib.js"></script>
<script type="text/javascript" language="javascript" src="scripts/tooltips/domTT.js"></script>
<link rel="stylesheet" type="text/css" href="style/style.css">
<script type="text/javascript">
function disableAll() {
var all_value;
for (i = 0; i < document.f.all.length; i++) {
if (document.f.all[i].checked) {
all_value = document.f.all[i].value;
}
}
for (i = 0; i < document.f.client.length; i++) {
if (all_value == "true") {
document.f.client[i].disabled = true;
document.f.other.disabled = true;
var boxall = document.getElementById('boxall');
var boxspecify = document.getElementById('boxspecify');
boxall.style.background = "#fffbe2"
boxspecify.style.background = "#F4F4F4"
}
else {
document.f.client[i].disabled = false;
document.f.other.disabled = false;
var boxall = document.getElementById('boxall');
var boxspecify = document.getElementById('boxspecify');
boxall.style.background = "#F4F4F4"
boxspecify.style.background = "#fffbe2"
}
}
}
function selectCheckbox(boxName) {
for (i = 0; i < document.f.client.length; i++) {
var box = document.f.client[i];
if (box.value == boxName) {
box.checked = !box.checked;
}
}
}
</script>
<style type="text/css">
.content {
border-color: #bbb;
border-style: solid;
border-width: 0px 0px 1px 0px;
}
/* Default DOM Tooltip Style */
div.domTT {
border: 1px solid #bbb;
background-color: #F9F5D5;
font-family: arial;
font-size: 9px;
padding: 5px;
}
div.domTT .caption {
font-family: serif;
font-size: 12px;
font-weight: bold;
padding: 1px 2px;
color: #FFFFFF;
}
div.domTT .contents {
font-size: 12px;
font-family: sans-serif;
padding: 3px 2px;
}
.textfield {
font-size: 11px;
font-family: verdana;
padding: 3px 2px;
background: #efefef;
}
.keyword-field {
font-size: 11px;
font-family: verdana;
padding: 3px 2px;
}
</style>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<% if (submit || remove) { %>
<div class="success">
<fmt:message key="permitted.client.success"/>
</div>
<br>
<% }%>
<form name="f" action="permitted-clients.jsp" method="post">
<fieldset style="display: block;width:620px;">
<legend><fmt:message key="permitted.client.legend"/></legend>
<div class="clientscontent">
<div class="permitclientbox permitclientActive" id="boxall">
<input type="radio" name="all" value="true" onclick="disableAll();" <%= clients.contains("all") ? "checked" : ""%> /><strong><fmt:message key="permitted.client.all.clients"/></strong> - <fmt:message key="permitted.client.all.clients.description"/>
</div>
<div class="permitclientbox" id="boxspecify">
<input type="radio" name="all" value="false" onclick="disableAll();" <%= !clients.contains("all") ? "checked" : ""%> /><strong><fmt:message key="permitted.client.specific.clients"/></strong><br>
<div class="specifyclients">
<table border="0">
<tr>
<td valign="top" nowrap>
<div style="display: block; width: 260px;">
<%
int count = 0;
for (Clients client : Clients.values()) {
count++;
if (count == 6) {
%>
</div>
</td>
<td valign="top" nowrap>
<div style="display: block; width: 205px;">
<% } %>
<label for="<%= client.getName() %>"><input type="checkbox" name="client" value="<%= client.getName() %>" id="<%= client.getName() %>" <%= clients.contains(client.getName()) ? "checked" : ""%> /> <img src="<%= client.getImage() %>" width="16" height="16" border="0" alt=""> <strong><%= client.getName() %></strong></label><span>(<a href="<%= client.getURL() %>" target="_blank"><fmt:message key="permitted.client.website"/></a>)</span><br>
<% } %>
</div>
</td>
</tr>
</table>
<span class="horizontalrule" style="height:1px;"></span>
<strong><fmt:message key="permitted.client.add.other.client" />:</strong>
<a onmouseover="domTT_activate(this, event, 'content', '<fmt:message key="permitted.client.tooltip" />', 'trail', true, 'direction', 'northeast', 'width', '220');"><img src="images/icon_help_14x14.gif" align="texttop" /></a><br>
<input type="text" name="other" style="width: 160px;">&nbsp;<input type="submit" name="addOther" value="<fmt:message key="permitted.client.add" />"/><br>
<% for (String otherClient : otherClients) { %>
<%= otherClient%>&nbsp(<a href="permitted-clients.jsp?removeClient=<%=otherClient%>" name="removeClient" id="<%= otherClient %>"><fmt:message key="permitted.client.remove" /></a>)<br>
<% } %>
</div>
</div>
</div>
</fieldset>
<input type="submit" name="submit" value="<fmt:message key="permitted.client.save.settings" />" style="clear: both; margin-top: 15px;"/>
</form>
<script type="text/javascript">
disableAll();
</script>
</body>
</html>
<%!
void persistOtherClients(List otherClients) {
// Build other string.
StringBuilder builder = new StringBuilder();
for (int i = 0; i < otherClients.size(); i++) {
builder.append(otherClients.get(i));
if (i < otherClients.size()) {
builder.append(",");
}
}
JiveGlobals.setProperty("other.clients.allowed", builder.toString());
}
%>
\ No newline at end of file
<%@ page import="org.jivesoftware.openfire.XMPPServer" %>
<%@ page import="org.jivesoftware.util.JiveGlobals" %>
<%@ page import="java.io.File" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<html>
<head>
<title><fmt:message key="spark.download.title" /></title>
<meta name="pageID" content="spark-download"/>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<fmt:message key="spark.download.instructions" />
<br/><br/>
<%
String url = request.getRequestURL().toString();
String server = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
url = url.replace("localhost", server);
url = url.replace("spark-download.jsp", "getspark");
boolean windowsClientExists = false;
boolean macClientExists = false;
boolean linuxClientExists = false;
File buildDir = new File(JiveGlobals.getHomeDirectory(), "enterprise" + File.separator + "spark");
if (buildDir.exists()) {
File[] list = buildDir.listFiles();
int no = list != null ? list.length : 0;
for (int i = 0; i < no; i++) {
File clientFile = list[i];
if (clientFile.getName().endsWith(".exe")) {
windowsClientExists = true;
}
else if (clientFile.getName().endsWith(".dmg")) {
macClientExists = true;
}
else if(clientFile.getName().endsWith(".tar.gz")){
linuxClientExists = true;
}
}
}
boolean showEmailTemplate = windowsClientExists || macClientExists || linuxClientExists;
%>
<table><tr><td><img src="images/win.gif" alt=""></td><td><b><fmt:message key="spark.download.windows" /></b></td>
<% if(windowsClientExists){ %>
<td><a href="getspark?os=windows"><%= url %>?os=windows</a></td>
<% } else { %>
<td><fmt:message key="spark.download.nobuild" /></td>
<% } %>
</tr>
<tr>
<td><img src="images/mac.gif" alt=""></td><td><b><fmt:message key="spark.download.mac" /></b></td>
<% if(macClientExists){ %>
<td><a href="getspark?os=mac"><%= url %>?os=mac</a></td>
<% } else { %>
<td><fmt:message key="spark.download.nobuild" /></td>
<% } %>
</tr>
<tr>
<td><img src="images/zip.gif" alt=""></td><td><b><fmt:message key="spark.download.nix" /></b></td>
<% if(linuxClientExists){ %>
<td><a href="getspark?os=linux"><%= url %>?os=linux</a></td>
<% } else { %>
<td><fmt:message key="spark.download.nobuild" /></td>
<% } %>
</tr>
</table>
<br/><br/>
<% if(showEmailTemplate){%>
<p><b><fmt:message key="spark.download.emailtemplate" /></b></p>
<p>
<fmt:message key="spark.download.emailtemplate.instructions" />
</p>
<div style="padding:4px;background-color:#eee;width:500px;">
<p>
<fmt:message key="spark.download.emailtemplate.template.part1" />
<br/><br/>
<fmt:message key="spark.download.windows" />
<% if(windowsClientExists) { %>
<%= url + "?os=windows" %>
<% } else { %>
<fmt:message key="spark.download.nobuild" />
<% } %>
<br/>
<fmt:message key="spark.download.mac" />
<% if(macClientExists) { %>
<%= url + "?os=mac" %>
<% } else { %>
<fmt:message key="spark.download.nobuild" />
<% } %>
<br/>
<fmt:message key="spark.download.nix" />
<% if(linuxClientExists) { %>
<%= url + "?os=linux" %>
<% } else { %>
<fmt:message key="spark.download.nobuild" />
<% } %>
<br/><br/>
<fmt:message key="spark.download.emailtemplate.template.part2"/>
<fmt:message key="spark.download.emailtemplate.template.part3">
<fmt:param value="<%= "<b>" + XMPPServer.getInstance().getServerInfo().getXMPPDomain() + "</b>" %>" />
</fmt:message>
<fmt:message key="spark.download.emailtemplate.template.part4"/>
</p>
</div>
<% } %>
</body>
</html>
<%@ page errorPage="error.jsp" import="org.jivesoftware.openfire.XMPPServer" %>
<%@ page import="org.jivesoftware.util.JiveGlobals" %>
<%@ page import="org.jivesoftware.util.ParamUtils" %>
<%@ page import="java.io.File" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.io.FilenameFilter"%>
<%@ page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%@ page import="java.util.List"%>
<%@ page import="org.apache.commons.fileupload.FileUploadException"%>
<%@ page import="org.jivesoftware.util.Log"%>
<%@ page import="org.apache.commons.fileupload.FileItem"%>
<%@ page import="java.util.Iterator"%>
<%@ page import="java.io.FileOutputStream"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<html>
<head>
<title><fmt:message key="spark.version.title" /></title>
<meta name="pageID" content="spark-version"/>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<%
String submitted = ParamUtils.getParameter(request, "submit");
String windowClient = "";
String macClient = "";
String linuxClient = "";
String optionalMessage = "";
boolean updated = false;
if (submitted != null && submitted.trim().length() > 0) {
windowClient = ParamUtils.getParameter(request, "windowsClient");
macClient = ParamUtils.getParameter(request, "macClient");
linuxClient = ParamUtils.getParameter(request, "linuxClient");
// Persist.
if(windowClient != null){
JiveGlobals.setProperty("spark.windows.client", windowClient);
updated = true;
}
if(macClient != null){
JiveGlobals.setProperty("spark.mac.client", macClient);
updated = true;
}
if(linuxClient != null){
JiveGlobals.setProperty("spark.linux.client", linuxClient);
updated = true;
}
String url = request.getRequestURL().toString();
String server = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
url = url.replace("localhost", server);
url = url.replace("spark-form.jsp", "getspark");
JiveGlobals.setProperty("spark.client.downloadURL", url);
optionalMessage = ParamUtils.getParameter(request, "optionalMessage");
if(optionalMessage != null){
JiveGlobals.setProperty("spark.client.displayMessage", optionalMessage);
}
else {
JiveGlobals.deleteProperty("spark.client.displayMessage");
}
}
else {
windowClient = JiveGlobals.getProperty("spark.windows.client");
macClient = JiveGlobals.getProperty("spark.mac.client");
linuxClient = JiveGlobals.getProperty("spark.linux.client");
optionalMessage = JiveGlobals.getProperty("spark.client.displayMessage");
}
if (optionalMessage == null){
optionalMessage = "";
}
File buildDir = new File(JiveGlobals.getHomeDirectory(), "enterprise" + File.separator + "spark");
// Create the directory if it doesn't exist.
if (!buildDir.exists()) {
buildDir.mkdirs();
}
DiskFileUpload upload = new DiskFileUpload();
List items = null;
try {
items = upload.parseRequest(request);
}
catch (Exception e) {
// I'm going to ignore this Greg. That's right.
}
boolean uploaded = false;
if (items != null) {
for (Object item : items) {
FileItem fileItem = (FileItem) item;
if (!fileItem.isFormField()) {
String fieldName = fileItem.getFieldName();
if ("file".equals(fieldName)) {
String filename = fileItem.getName();
filename = new File(filename).getName();
byte[] data = fileItem.get();
if (filename != null && filename.trim().length() > 0) {
uploaded = true;
// Write out Client to dir.
FileOutputStream faos = new FileOutputStream(new File(buildDir, filename));
faos.write(data);
faos.flush();
faos.close();
}
}
}
}
}
%>
<jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean"/>
<fmt:message key="spark.version.instructions" />
<br/><br/>
<form name="f" action="spark-form.jsp" enctype="multipart/form-data" method="post">
<table>
<tr>
<td colspan="3"><fmt:message key="spark.version.form.builds" /><tt><%= buildDir.getAbsolutePath()%></tt></td>
</tr>
<tr>
<td><tt><fmt:message key="spark.version.form.upload" /></tt></td>
<td><input type="file" name="file" size="40" /></td>
<td><input type="submit" name="upload" value="<fmt:message key="spark.version.form.button" />" /></td>
</tr>
</table>
</form>
<% if(updated){%>
<div class="success">
<fmt:message key="spark.version.form.confirmation.build" />
</div><br>
<% } %>
<% if(uploaded){ %>
<div class="success">
<fmt:message key="spark.version.form.confirmation.upload" />
</div><br/>
<% } %>
<form action="spark-form.jsp" method="GET">
<table><tr><td><img src="images/win.gif" alt=""></td><td><b><fmt:message key="spark.version.form.clients.windows" /></b></td></tr></table>
<%
File[] list = buildDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".exe");
}
});
if (list != null && list.length > 0) {
%>
<div class="jive-table">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<thead>
<tr>
<th nowrap><fmt:message key="spark.version.form.clients.active" /></th>
<th nowrap><fmt:message key="spark.version.form.clients.name" /></th>
<th nowrap><fmt:message key="spark.version.form.clients.date" /></th>
</tr>
</thead>
<tbody>
<%
for (File clientFile : list) {
Date buildDate = new Date(clientFile.lastModified());
String date = JiveGlobals.formatDateTime(buildDate);
String selected = "";
if (windowClient != null && clientFile.getName().equals(windowClient)) {
selected = "checked";
}
%>
<tr>
<td width="1%" align="center"><input type="radio" name="windowsClient"
value="<%= clientFile.getName() %>" <%= selected %>></td>
<td width="1%"><b><%= clientFile.getName()%>
</b></td>
<td><%=date %>
</td>
</tr>
<%
}
%>
</tbody>
</table>
</div>
<% } else { %>
<ul><i><fmt:message key="spark.version.form.clients.nobuilds" /></i></ul>
<% } %>
<br/>
<table><tr><td><img src="images/mac.gif" alt=""></td><td><b><fmt:message key="spark.version.form.clients.mac" /></b></td></tr></table>
<%
list = buildDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".dmg");
}
});
if (list != null && list.length > 0) {
%>
<div class="jive-table">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<thead>
<tr>
<th nowrap><fmt:message key="spark.version.form.clients.active" /></th>
<th nowrap><fmt:message key="spark.version.form.clients.name" /></th>
<th nowrap><fmt:message key="spark.version.form.clients.date" /></th>
</tr>
</thead>
<tbody>
<%
for (File clientFile : list) {
Date buildDate = new Date(clientFile.lastModified());
String date = JiveGlobals.formatDateTime(buildDate);
String selected = "";
if (macClient != null && clientFile.getName().equals(macClient)) {
selected = "checked";
}
%>
<tr>
<td width="1%" align="center"><input type="radio" name="macClient"
value="<%= clientFile.getName()%>" <%= selected%>></td>
<td width="1%"><b><%= clientFile.getName()%>
</b></td>
<td><%=date %>
</td>
</tr>
<%
}
%>
</tbody>
</table>
</div>
<% } else { %>
<ul><i><fmt:message key="spark.version.form.clients.nobuilds" /></i></ul>
<% } %>
<br/>
<table><tr><td><img src="images/zip.gif" alt=""></td><td><b><fmt:message key="spark.version.form.clients.nix" /></b></td></tr></table>
<%
list = buildDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".tar.gz");
}
});
if (list != null && list.length > 0) {
%>
<div class="jive-table">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<thead>
<tr>
<th nowrap><fmt:message key="spark.version.form.clients.active" /></th>
<th nowrap><fmt:message key="spark.version.form.clients.name" /></th>
<th nowrap><fmt:message key="spark.version.form.clients.date" /></th>
</tr>
</thead>
<tbody>
<%
for (File clientFile : list) {
Date buildDate = new Date(clientFile.lastModified());
String date = JiveGlobals.formatDateTime(buildDate);
String selected = "";
if (linuxClient != null && clientFile.getName().equals(linuxClient)) {
selected = "checked";
}
%>
<tr>
<td width="1%" align="center"><input type="radio" name="linuxClient"
value="<%= clientFile.getName()%>" <%= selected%>></td>
<td width="1%"><b><%= clientFile.getName()%>
</b></td>
<td><%=date %>
</td>
</tr>
<%
}
%>
</tbody>
</table>
</div>
<% } else { %>
<ul><i><fmt:message key="spark.version.form.clients.nobuilds" /></i></ul>
<% } %>
<br/><br/>
<fieldset>
<legend><fmt:message key="spark.version.form.optional" /></legend>
<div>
<p>
<fmt:message key="spark.version.form.optional.instructions" />
</p>
<table cellpadding="3" cellspacing="0" border="0" width="100%">
<tbody>
<tr>
<td>
<textarea name="optionalMessage" cols="40" rows="3" wrap="virtual"><%= optionalMessage%></textarea>
</td>
</tr>
</tbody>
</table>
</div>
</fieldset>
<br/><br/>
<input type="submit" name="submit" value="<fmt:message key="spark.version.form.update" />">
</form>
</body>
</html>
/* alertbox styles (errors and warnings) */
/* global alertbox styles */
.alertbox {
display: block;
position: relative;
-moz-border-radius: 3px;
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
width: 735px;
height: auto;
font-size: .85em;
color: #000000;
overflow: hidden;
}
.alertbox h3 {
display: block;
font-size: 1.1em;
margin: 15px 0px 5px 0px;
padding: 0px;
}
.alertbox p {
font-size: .9em;
margin: 3px 0px 10px 0px;
}
.alertbox a {
color: #000000;
}
.alertbox a:hover {
text-decoration: underline;
}
.linkbtn {
display: block;
position: relative;
float: right;
z-index: 100;
top: 10px;
right: 10px;
}
.linkbtn a {
font-weight: bold;
text-decoration: none;
}
.linkbtn a:hover {
text-decoration: underline;
}
.licenseIcon {
display: block;
position: absolute;
width: 22px;
height: 22px;
margin: 12px 12px 20px 12px;
padding: 0px 0px 0px 0px;
}
.licenseIconsmall {
display: block;
position: relative;
float: left;
width: 16px;
height: 16px;
margin: 0px 5px 4px 0px;
padding: 0px 0px 0px 0px;
}
.licenseContent {
display: block;
position: relative;
clear: none;
top: 0px;
left: 50px;
width: 670px;
}
/* alertboxsmall styles */
.alertboxsmall {
display: block;
position: relative;
float: right;
-moz-border-radius-topleft: 3px;
-moz-border-radius-bottomleft: 3px;
padding: 0px 0px 0px 0px;
margin: -12px -18px 0px 0px;
width: 100px;
font-size: .85em;
color: #000000;
}
.alertboxsmall div.licenseContentsmall {
margin: 5px;
line-height: 1.2em;
}
.alertboxsmall div.licenseContentsmall a {
display: block;
font-weight: bold;
text-decoration: none;
color: #A85E00;
padding: 3px 0px 0px 0px;
}
.alertboxsmall div.licenseContentsmall a:hover {
text-decoration: underline;
}
/* error-specific alertbox styles */
.licenseError {
border: 1px solid #BB8888;
background: #EDB9B1 url(../images/certificateimg_error.gif) no-repeat bottom right;
}
.licenseError div.licenseIcon {
background: url(../images/icon_error.gif) no-repeat;
}
.licenseError h3 {
color: #8C0900;
}
.licenseError div.linkbtn a {
color: #8C0900;
}
/* warning-specific alertbox styles */
.licenseWarning {
border: 1px solid #D9B04C;
background: #FFE9B2 url(../images/certificateimg_warning.gif) no-repeat bottom right;
margin-bottom: 10px;
}
.licenseWarning div.licenseIcon {
background: url(../images/icon_warning.gif) no-repeat;
}
.licenseWarning h3 {
color: #CA7303;
}
.licenseWarning div.linkbtn a {
color: #A85E00;
}
.licenseWarningsmall div.licenseIconsmall {
background: url(../images/icon_warning-small.gif) no-repeat;
}
.licenseWarningsmall {
border: 1px solid #D9B04C;
background: #FFE9B2;
}
/* license page specific styles */
.licenseHeader {
display: block;
width: 732px;
overflow: hidden;
border: 1px solid #BBBBBB;
}
.licenseHeader strong {
display: block;
margin: 5px 10px 5px 10px;
}
.licenseBody {
display: block;
width: 732px;
overflow: hidden;
background-color: #FFFFFF;
border: 1px solid #BBBBBB;
border-top: none;
margin-bottom: 25px;
}
.licenseBody table {
width: 90%;
margin: 10px;
}
.licenseBody div.licenseContents {
width: 710px;
margin: 13px;
}
#enterLicenseLink {
display: block;
}
#enterLicenseLink a.licenseLink {
background: url(/images/add-16x16.gif) no-repeat;
padding: 0px 0px 0px 20px;
}
#enterLicense {
display: block;
}
#enterLicense a.cancelLink {
background: url(/images/forbidden-16x16.gif) no-repeat;
padding: 0px 0px 0px 20px;
}
.licenseBody form {
display: block;
width: 680px;
margin: 0px 0px 15px 0px;
padding: 0px;
text-align: right;
}
.licenseBody form textarea {
width: 680px;
height: 185px;
margin-bottom: 5px;
font-family: "Courier New", Courier, monospace;
font-size: 13px;
}
.licenseFormError {
width: 680px;
text-align:left;
color: #8C0900;
font-weight: bold;
padding: 10px 0px 10px 0px;
}
strong.erroritem {
color: #6E1F1F;
}
/* general page elements */
table.settingsTable {
display: block;
border: 1px solid #BBBBBB;
margin: 5px 0px 15px 0px;
}
table.settingsTable thead th {
border-bottom: 1px solid #BBBBBB;
padding: 3px 8px 3px 12px;
font-weight: bold;
text-align: left;
}
table.settingsTable tbody tr td {
padding: 5px 10px 5px 15px;
}
table.settingsTable tbody tr td p {
padding: 10px 0px 5px 0px;
}
table.settingsTable tr {
padding: 0px 0px 10px 0px;
}
/* Permit Client specific styles */
/* modified the fieldset from existing */
/* condensed border to one entry, pulled "width: 95%;" */
fieldset {
display: block;
position: relative;
-moz-border-radius: 3px;
border: 1px solid #CCCCCC;
padding: 2px 0px 0px 0px;
margin: 0px 0px 0px 0px;
}
fieldset legend {
color: #000000;
margin-left: 15px;
}
.clientscontent {
display: block;
position: relative;
margin: 0px 15px 0px 15px;
}
.permitclientbox {
display: block;
position: relative;
border: 1px solid #DCDCDC;
-moz-border-radius: 3px;
padding: 3px 2px 2px 2px;
margin: 10px 0px 10px 0px;
width: 600px;
height: auto;
color: #000000;
overflow: hidden;
background-color: #F4F4F4;
line-height: 1.6em;
}
.permitclientbox table tr td {
line-height: 1.8em;
}
.permitclientbox span {
font-size: .85em;
margin-left: 4px;
}
.horizontalrule {
display: block;
height: 1px;
background-color: #DCDCDC;
margin-top: 2px;
margin-bottom: 14px;
overflow: hidden;
clear: both;
}
.permitclientActive {
background-color: #FFFBE2;
}
.specifyclients {
display: block;
position: relative;
margin: 0px 15px 18px 15px;
width: auto;
padding: 0px;
}
/* Reports specific styles */
tr.allreports_report_default td {
padding: 3px 5px 3px 12px;
cursor: pointer;
background-color: #ffffff;
border: none;
border-top: 1px solid #ffffff;
border-bottom: 1px solid #ffffff;
font-size: 12px;
color: #D76C0D;
}
tr.allreports_report_selected td {
padding: 3px 5px 3px 12px;
cursor: pointer;
border: none;
border-top: 1px solid #bbbbbb;
border-bottom: 1px solid #bbbbbb;
background: #edeed7 url('../images/reports_selected-arrow.gif') no-repeat top left;
background-position: 4px 6px;
font-size: 12px;
color: #2f302b;
font-weight: bold;
}
tr.allreports_report_hover td {
padding: 3px 5px 3px 12px;
cursor: pointer;
background-color: #f4f4f4;
border: none;
border-top: 1px solid #bbbbbb;
border-bottom: 1px solid #bbbbbb;
font-size: 12px;
color: #D76C0D;
}
<%@ page import="org.jivesoftware.openfire.plugin.spark.Bookmark" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.BookmarkManager" %>
<%@ page import="org.jivesoftware.openfire.plugin.spark.SparkUtil" %>
<%@ page import="java.util.Collection" %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<%
boolean urlBookmarkCreated = request.getParameter("urlCreated") != null;
boolean delete = request.getParameter("delete") != null;
final Collection<Bookmark> bookmarks = BookmarkManager.getBookmarks();
%>
<html>
<head>
<title><fmt:message key="bookmark.url.manager.title" /></title>
<link rel="stylesheet" type="text/css" href="/style/global.css">
<meta name="pageID" content="url-bookmarks"/>
<script src="/js/prototype.js" type="text/javascript"></script>
<script src="/js/scriptaculous.js" type="text/javascript"></script>
<style type="text/css">
.small-label {
font-size: 11px;
font-weight: bold;
}
.div-border {
border: 1px solid #CCCCCC;
-moz-border-radius: 3px;
}
</style>
<style type="text/css">
@import "style/style.css";
</style>
</head>
<body>
<p>
<fmt:message key="bookmark.url.manager.description" />
</p>
<% if (urlBookmarkCreated) { %>
<div class="success">
<fmt:message key="bookmark.url.success" />
</div>
<%}%>
<% if (delete) { %>
<div class="success">
<fmt:message key="bookmark.url.deleted" />
</div>
<% } %>
<br/>
<div class="div-border" style="padding: 12px; width: 95%;">
<table class="jive-table" cellspacing="0" width="100%">
<th><fmt:message key="bookmark.url.name" /></th>
<th><fmt:message key="bookmark.url" /></th>
<th><fmt:message key="bookmark.url.users" /></th>
<th><fmt:message key="bookmark.url.groups" /></th>
<th><fmt:message key="bookmark.url.rss" /></th>
<th><fmt:message key="bookmark.url.options" /></th>
<%
boolean hasBookmarks = false;
for (Bookmark bookmark : bookmarks) {
String users = "";
String groups = "";
if (bookmark.getType() != Bookmark.Type.url) {
continue;
}
else {
hasBookmarks = true;
if (bookmark.isGlobalBookmark()) {
users = "ALL";
groups = "ALL";
}
else {
users = getCommaDelimitedList(bookmark.getUsers(), 5);
groups = getCommaDelimitedList(bookmark.getGroups(), 5);
}
}
%>
<tr>
<td><%= bookmark.getName()%></td>
<td><%= bookmark.getValue()%></td>
<td><%= users%></td>
<td><%= groups%></td>
<td><%= bookmark.getProperty("rss") != null ? "<img src='/images/check.gif'>" : "&nbsp;"%></td>
<td>
<a href="create-bookmark.jsp?edit=true&type=url&bookmarkID=<%= bookmark.getBookmarkID()%>"><img src="/images/edit-16x16.gif" border="0" width="16" height="16" alt="Edit Bookmark"/></a>
<a href="confirm-bookmark-delete.jsp?bookmarkID=<%= bookmark.getBookmarkID()%>"><img src="/images/delete-16x16.gif" border="0" width="16" height="16" alt="Delete Bookmark"/></a>
</td>
</tr>
<% } %>
<% if (!hasBookmarks) { %>
<tr>
<td colspan="6" align="center"><fmt:message key="bookmark.url.no.bookmarks" /></td>
</tr>
<%} %>
<tr>
<td colspan="6">
<a href="create-bookmark.jsp?type=url"><img src="/images/add-16x16.gif" border="0" align="texttop" style="margin-right: 3px;"/><fmt:message key="bookmark.url.add" /></a>
</td>
</tr>
</table>
</div>
</body>
</html>
<%!
/**
* A more elegant string representing all users that this bookmark
* "belongs" to.
*
* @return the string.
*/
public String getCommaDelimitedList(Collection<String> strings, int limit) {
int counter = 0;
StringBuilder buf = new StringBuilder();
for (String string : strings) {
buf.append(string);
buf.append(",");
counter++;
if (counter >= limit) {
break;
}
}
String returnStr = buf.toString();
if (returnStr.endsWith(",")) {
returnStr = returnStr.substring(0, returnStr.length() - 1);
}
if (!SparkUtil.hasLength(returnStr)) {
returnStr = "&nbsp;";
}
return returnStr;
}
%>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment