blob: a148d35ffb505ec47721048308f8322f7a7c90b3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.installation;
import static org.apache.openmeetings.db.dao.user.UserDao.getNewUserInstance;
import static org.apache.openmeetings.db.dto.user.OAuthUser.PARAM_EMAIL;
import static org.apache.openmeetings.db.dto.user.OAuthUser.PARAM_FNAME;
import static org.apache.openmeetings.db.dto.user.OAuthUser.PARAM_LNAME;
import static org.apache.openmeetings.db.dto.user.OAuthUser.PARAM_LOGIN;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_APPLICATION_BASE_URL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_APPLICATION_NAME;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_APPOINTMENT_REMINDER_MINUTES;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_AUTO_OPEN_SHARING;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CALENDAR_ROOM_CAPACITY;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CAM_FPS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CHAT_SEND_ON_ENTER;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CRYPT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CSP_FONT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CSP_FRAME;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CSP_IMAGE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CSP_MEDIA;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CSP_SCRIPT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_CSP_STYLE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_RSS_FEED1;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_RSS_FEED2;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_CHAT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANDING_ZONE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LDAP_ID;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_TIMEZONE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DISPLAY_NAME_EDITABLE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DOCUMENT_DPI;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DOCUMENT_QUALITY;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EMAIL_AT_REGISTER;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EMAIL_VERIFICATION;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EXT_PROCESS_TTL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FNAME_MIN_LENGTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_GOOGLE_ANALYTICS_CODE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_KEYCODE_ARRANGE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_KEYCODE_ARRANGE_RESIZE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_KEYCODE_MUTE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_KEYCODE_MUTE_OTHERS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_KEYCODE_QUICKPOLL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_LNAME_MIN_LENGTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_LOGIN_MIN_LENGTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MIC_ECHO;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MIC_NOISE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MIC_RATE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_BITRATE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_RATE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_VIDEO_PRESET;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_FFMPEG;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_IMAGEMAGIC;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_OFFICE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PATH_SOX;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_FRONTEND;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_OAUTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_SOAP;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REMINDER_MESSAGE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REPLY_TO_ORGANIZER;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REST_ALLOW_ORIGIN;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_ALLOW_REMOTE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS_SHOW;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_QUALITY;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_EXTEN_CONTEXT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ROOM_PREFIX;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_PASS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_PORT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_SERVER;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_SSL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_SYSTEM_EMAIL;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_TIMEOUT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_TIMEOUT_CON;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_TLS;
import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SMTP_USER;
import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_APP_NAME;
import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_CSP_FONT;
import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_CSP_IMAGE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_CSP_STYLE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_MAX_UPLOAD_SIZE;
import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_MINUTES_REMINDER_SEND;
import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.USER_PASSWORD_MINIMUM_LENGTH;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getAudioBitrate;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getAudioRate;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultGroup;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getExtProcessTtl;
import static org.apache.wicket.csp.CSPDirectiveSrcValue.SELF;
import static org.apache.wicket.csp.CSPDirectiveSrcValue.STRICT_DYNAMIC;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.Consumer;
import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
import org.apache.openmeetings.db.dao.label.LabelDao;
import org.apache.openmeetings.db.dao.room.RoomDao;
import org.apache.openmeetings.db.dao.room.SipDao;
import org.apache.openmeetings.db.dao.server.OAuth2Dao;
import org.apache.openmeetings.db.dao.user.GroupDao;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.basic.Configuration;
import org.apache.openmeetings.db.entity.room.Room;
import org.apache.openmeetings.db.entity.room.Room.RoomElement;
import org.apache.openmeetings.db.entity.room.Room.Type;
import org.apache.openmeetings.db.entity.server.OAuthServer;
import org.apache.openmeetings.db.entity.server.OAuthServer.RequestInfoMethod;
import org.apache.openmeetings.db.entity.server.OAuthServer.RequestTokenMethod;
import org.apache.openmeetings.db.entity.user.Group;
import org.apache.openmeetings.db.entity.user.GroupUser;
import org.apache.openmeetings.db.entity.user.User;
import org.apache.openmeetings.db.entity.user.User.Right;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ImportInitvalues {
private static final Logger log = LoggerFactory.getLogger(ImportInitvalues.class);
private static final String VER_1_8 = "1.8.x";
private static final String VER_1_9 = "1.9.x";
private static final String VER_2_0 = "2.0.x";
private static final String VER_3_0 = "3.0.x";
private static final String VER_3_0_3 = "3.0.3";
private static final String VER_3_3_0 = "3.3.0";
private static final String VER_5_0_0 = "5.0.0";
private static final String CLIENT_PLACEHOLDER = "<put your client_id>";
private static final String SECRET_PLACEHOLDER = "<put your client_secret>";
private static final String EMAIL_PARAM = "email";
private static final String FNAME_PARAM = "first_name";
private static final String LNAME_PARAM = "last_name";
@Autowired
private ConfigurationDao cfgDao;
@Autowired
private UserDao userDao;
@Autowired
private SipDao sipDao;
@Autowired
private OAuth2Dao oauthDao;
@Autowired
private GroupDao groupDao;
@Autowired
private RoomDao roomDao;
private int progress = 0;
public int getProgress() {
return progress;
}
private static void addCfg(List<Configuration> list
, String key
, String value
, Configuration.Type type
, String comment
, String fromVersion)
{
Configuration c = new Configuration();
c.setType(type);
c.setKey(key);
c.setValue(value);
c.setComment(comment);
c.setFromVersion(fromVersion);
list.add(c);
}
/*
* This method is created to be used to generate GeneralConfiguration.xml
*/
public static List<Configuration> initialCfgs(InstallationConfig cfg) {
List<Configuration> list = new ArrayList<>();
addCfg(list, CONFIG_CRYPT, cfg.getCryptClassName(), Configuration.Type.STRING,
"This Class is used for Authentification-Crypting. "
+ "Be carefull what you do here! If you change it while "
+ "running previous Pass of users will not be workign anymore! "
+ "for more Information see https://openmeetings.apache.org/CustomCryptMechanism.html"
, VER_1_9);
addCfg(list, CONFIG_REGISTER_FRONTEND, String.valueOf(cfg.isAllowFrontendRegister()), Configuration.Type.BOOL
, "Is USER register available on login screen", VER_1_8);
addCfg(list, CONFIG_REGISTER_SOAP, String.valueOf(true), Configuration.Type.BOOL, "Is user register available via SOAP/REST", VER_3_0);
addCfg(list, CONFIG_REGISTER_OAUTH, String.valueOf(true), Configuration.Type.BOOL, "Is user register available via OAuth", VER_3_0);
// this group_id is the Group of users who register through the frontend or SOAP
addCfg(list, CONFIG_DEFAULT_GROUP_ID, String.valueOf(getDefaultGroup()), Configuration.Type.NUMBER, "", VER_1_8);
addCfg(list, CONFIG_SMTP_SERVER, cfg.getSmtpServer(), Configuration.Type.STRING, "this is the smtp server to send messages", VER_1_9);
addCfg(list, CONFIG_SMTP_PORT, String.valueOf(cfg.getSmtpPort()), Configuration.Type.NUMBER, "this is the smtp server port normally 25", VER_1_9);
addCfg(list, CONFIG_SMTP_SYSTEM_EMAIL, cfg.getMailReferer(), Configuration.Type.STRING, "all send e-mails by the system will have this address", VER_1_9);
addCfg(list, CONFIG_SMTP_USER, cfg.getMailAuthName(), Configuration.Type.STRING, "System auth email username", VER_1_9);
addCfg(list, CONFIG_SMTP_PASS, cfg.getMailAuthPass(), Configuration.Type.STRING, "System auth email password", VER_1_9);
addCfg(list, CONFIG_SMTP_TLS, String.valueOf(cfg.isMailUseTls()), Configuration.Type.BOOL, "Enable TLS", VER_1_9);
addCfg(list, CONFIG_SMTP_TIMEOUT_CON, "30000", Configuration.Type.NUMBER,
"Socket connection timeout value in milliseconds. Default is 30 seconds (30000).", VER_1_9);
addCfg(list, CONFIG_SMTP_TIMEOUT, "30000", Configuration.Type.NUMBER,
"Socket I/O timeout value in milliseconds. Default is 30 seconds (30000).", VER_1_9);
addCfg(list, CONFIG_APPLICATION_NAME, DEFAULT_APP_NAME, Configuration.Type.STRING, "Name of the Browser Title window", VER_3_0);
// "1" == "EN"
addCfg(list, CONFIG_DEFAULT_LANG, String.valueOf(cfg.getDefaultLangId()), Configuration.Type.NUMBER, "Default System Language ID see languages.xml", VER_1_8);
addCfg(list, CONFIG_DOCUMENT_DPI, String.valueOf(cfg.getDocDpi()), Configuration.Type.NUMBER,
"dpi for conversion of PDF to images (should be an integer between 50 and 600 with a default value of 150 dpi)", VER_2_0);
addCfg(list, CONFIG_DOCUMENT_QUALITY, String.valueOf(cfg.getDocQuality()), Configuration.Type.NUMBER,
"compression quality for conversion of PDF to images (should be an integer between 1 and 100, with a default value of 90)", VER_2_0);
addCfg(list, CONFIG_PATH_IMAGEMAGIC, cfg.getImageMagicPath(), Configuration.Type.STRING, "Path to ImageMagick tools", VER_2_0);
addCfg(list, CONFIG_PATH_SOX, cfg.getSoxPath(), Configuration.Type.STRING, "Path To SoX-Tools", VER_2_0);
addCfg(list, CONFIG_PATH_FFMPEG, cfg.getFfmpegPath(), Configuration.Type.STRING, "Path To FFMPEG", VER_2_0);
addCfg(list, CONFIG_PATH_OFFICE, cfg.getOfficePath(), Configuration.Type.STRING,
"The path to OpenOffice/LibreOffice (optional) please set this to the real path in case jodconverter is unable to find OpenOffice/LibreOffice installation automatically", VER_2_0);
addCfg(list, CONFIG_DASHBOARD_RSS_FEED1, cfg.getUrlFeed(), Configuration.Type.STRING, "Feed URL 1", VER_1_9);
addCfg(list, CONFIG_DASHBOARD_RSS_FEED2, cfg.getUrlFeed2(), Configuration.Type.STRING, "Feed URL 2", VER_1_9);
addCfg(list, CONFIG_EMAIL_AT_REGISTER, String.valueOf(cfg.isSendEmailAtRegister()), Configuration.Type.BOOL,
"User get a EMail with their Account data.", VER_2_0);
addCfg(list, CONFIG_EMAIL_VERIFICATION, String.valueOf(cfg.isSendEmailWithVerficationCode()), Configuration.Type.BOOL,
String.format("User must activate their account by clicking on the "
+ "activation-link in the registering Email "
+ "It makes no sense to make this(%s) 'true' while "
+ "%s is 'false' cause you need to send a EMail.", CONFIG_EMAIL_VERIFICATION, CONFIG_EMAIL_AT_REGISTER), VER_2_0);
addCfg(list, CONFIG_APPLICATION_BASE_URL, cfg.getBaseUrl(), Configuration.Type.STRING, "Base URL your OPenmeetings installation will be accessible at.", "3.0.2");
// ***************************************
// ***************************************
// SIP Integration Coniguration Values
// ***************************************
addCfg(list, CONFIG_SIP_ENABLED, String.valueOf(cfg.isSipEnable()), Configuration.Type.BOOL, "Enable to enable the red5SIP integration ", VER_1_9);
addCfg(list, CONFIG_SIP_ROOM_PREFIX, cfg.getSipRoomPrefix(), Configuration.Type.STRING, "Numerical prefix for OM rooms created inside the SIP", VER_1_9);
addCfg(list, CONFIG_SIP_EXTEN_CONTEXT, cfg.getSipExtenContext(), Configuration.Type.STRING, "Enable to enable the red5SIP integration ", VER_1_9);
// ***************************************
// ***************************************
// Timezone settings
// ***************************************
addCfg(list, CONFIG_DEFAULT_TIMEZONE, cfg.getTimeZone(), Configuration.Type.STRING, "This is the default timezone if nothing is specified", VER_1_9);
// ***************************************
// ***************************************
// additional settings
// ***************************************
addCfg(list, CONFIG_SCREENSHARING_QUALITY, "1", Configuration.Type.NUMBER,
"Default selection in ScreenSharing Quality:\n 0 - bigger frame rate, no resize\n 1 - no resize\n 2 - size == 1/2 of selected area\n 3 - size == 3/8 of selected area", VER_3_0_3);
addCfg(list, CONFIG_SCREENSHARING_FPS, "10", Configuration.Type.NUMBER, "Default selection in ScreenSharing FPS", VER_3_0_3);
addCfg(list, CONFIG_SCREENSHARING_FPS_SHOW, String.valueOf(true), Configuration.Type.BOOL, "Is screensharing FPS should be displayed or not", VER_3_0_3);
addCfg(list, CONFIG_SCREENSHARING_ALLOW_REMOTE, String.valueOf(true), Configuration.Type.BOOL
, "Is remote control will be enabled while screensharing. Allowing remote control will be not possible in case it is set to 'false'", "3.0.4");
addCfg(list, CONFIG_DASHBOARD_SHOW_MYROOMS, String.valueOf(true), Configuration.Type.BOOL, "Show 'My Rooms' widget on dashboard", VER_1_9);
addCfg(list, CONFIG_DASHBOARD_SHOW_CHAT, String.valueOf(true), Configuration.Type.BOOL, "Show 'Global Chat' outside the room", VER_1_9);
addCfg(list, CONFIG_DASHBOARD_SHOW_RSS, String.valueOf(false), Configuration.Type.BOOL, "Show RSS widget on dashboard", VER_1_9);
addCfg(list, CONFIG_MAX_UPLOAD_SIZE, String.valueOf(DEFAULT_MAX_UPLOAD_SIZE), Configuration.Type.NUMBER,
"Maximum size of upload file (bytes)", VER_1_8);
addCfg(list, CONFIG_APPOINTMENT_REMINDER_MINUTES, String.valueOf(DEFAULT_MINUTES_REMINDER_SEND), Configuration.Type.NUMBER,
"The number of minutes before reminder emails are send. Set to 0 to disable reminder emails", VER_1_9);
addCfg(list, CONFIG_LOGIN_MIN_LENGTH, String.valueOf(USER_LOGIN_MINIMUM_LENGTH), Configuration.Type.NUMBER,
"Number of chars needed in a user login", VER_1_9);
addCfg(list, CONFIG_PASS_MIN_LENGTH, String.valueOf(USER_PASSWORD_MINIMUM_LENGTH), Configuration.Type.NUMBER,
"Number of chars needed in a user password", VER_1_9);
addCfg(list, CONFIG_CALENDAR_ROOM_CAPACITY, "50", Configuration.Type.NUMBER,
"Default number of participants conference room created via calendar", VER_1_9);
addCfg(list, CONFIG_KEYCODE_ARRANGE, "Shift+F8", Configuration.Type.HOTKEY
, "A hot key code for arrange video windows functionality", VER_2_0);
addCfg(list, CONFIG_KEYCODE_MUTE_OTHERS, "Shift+F12", Configuration.Type.HOTKEY
, "A hot key code for the 'mute others' functionality", VER_2_0);
addCfg(list, CONFIG_KEYCODE_MUTE, "Shift+F7", Configuration.Type.HOTKEY
, "A hot key code for the 'mute/unmute audio' functionality", VER_2_0);
// system-wide ldap params
addCfg(list, CONFIG_DEFAULT_LDAP_ID, "0", Configuration.Type.NUMBER, "Ldap domain selected by default in the login screen", VER_1_9);
// set inviter's email address as ReplyTo in email invitations
addCfg(list, CONFIG_REPLY_TO_ORGANIZER, String.valueOf(cfg.isReplyToOrganizer()), Configuration.Type.BOOL,
"Set inviter's email address as ReplyTo in email invitations", VER_2_0);
addCfg(list, CONFIG_DEFAULT_LANDING_ZONE, "user/dashboard", Configuration.Type.STRING
, "Area to be shown to the user after login. Possible values are: "
+ "user/dashboard, user/calendar, user/record, rooms/my, rooms/group, rooms/public"
+ ", profile/messages, profile/edit, profile/search, profile/invitation, profile/widget"
+ ", admin/user, admin/connection"
+ ", admin/group, admin/room, admin/config, admin/lang, admin/ldap, admin/oauth2, admin/backup, admin/email", "2.1.x");
// oauth2 params
addCfg(list, CONFIG_IGNORE_BAD_SSL, String.valueOf(false), Configuration.Type.BOOL,
"Set \"yes\" or \"no\" to enable/disable ssl certifications checking for OAuth2\n"
+ "WARNING: it is not secure", VER_3_0);
addCfg(list, CONFIG_REDIRECT_URL_FOR_EXTERNAL, "", Configuration.Type.STRING,
"Users entered the room via invitationHash or secureHash will be redirected to this URL on connection lost", VER_3_0);
addCfg(list, CONFIG_GOOGLE_ANALYTICS_CODE, null, Configuration.Type.STRING, "Code for Google Analytics", "3.1.0");
addCfg(list, CONFIG_EXT_PROCESS_TTL, String.valueOf(getExtProcessTtl()), Configuration.Type.NUMBER, String.format("Time to live in minutes for external processes such as conversion via ffmpeg (default %s minutes)", getExtProcessTtl()), VER_3_3_0);
addCfg(list, CONFIG_MYROOMS_ENABLED, String.valueOf(true), Configuration.Type.BOOL, "Users are allowed to create personal rooms", "3.3.2");
addCfg(list, CONFIG_REMINDER_MESSAGE, null, Configuration.Type.STRING, "Reminder message to notify about upcoming appointment, generated message will be used if not set", VER_2_0);
addCfg(list, CONFIG_MP4_AUDIO_RATE, String.valueOf(getAudioRate()), Configuration.Type.NUMBER, "Audio sampling rate (in Hz) for MP4 video", "4.0.1");
addCfg(list, CONFIG_MP4_AUDIO_BITRATE, String.valueOf(getAudioBitrate()), Configuration.Type.STRING, "Audio bitrate for MP4 video", "4.0.1");
addCfg(list, CONFIG_REST_ALLOW_ORIGIN, null, Configuration.Type.STRING, "List of addresses browser Ajax REST requests are allowed from", "4.0.2");
addCfg(list, CONFIG_FNAME_MIN_LENGTH, String.valueOf(USER_LOGIN_MINIMUM_LENGTH), Configuration.Type.NUMBER,
"Number of chars needed in a user first name", "4.0.4");
addCfg(list, CONFIG_LNAME_MIN_LENGTH, String.valueOf(USER_LOGIN_MINIMUM_LENGTH), Configuration.Type.NUMBER,
"Number of chars needed in a user last name", "4.0.4");
addCfg(list, CONFIG_CHAT_SEND_ON_ENTER, String.valueOf(false), Configuration.Type.BOOL,
"Controls if chat message will be set on Enter (default: send on Ctrl+Enter)", "4.0.5");
addCfg(list, CONFIG_MP4_VIDEO_PRESET, "medium", Configuration.Type.STRING,
"Preset (encoder optimization settings) to be used while performing mp4 conversion."
+ "Valid values are: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow", "4.0.5");
addCfg(list, CONFIG_CAM_FPS, "30", Configuration.Type.NUMBER, "Camera FPS, should be positive number in range (0, 60]", VER_5_0_0);
addCfg(list, CONFIG_MIC_RATE, "22", Configuration.Type.NUMBER, "The rate at which the microphone should capture sound, in kHz. The default value is 22 kHz.", VER_5_0_0);
addCfg(list, CONFIG_MIC_ECHO, String.valueOf(true), Configuration.Type.BOOL, "Whether or not echo cancellation is preferred and/or required.", VER_5_0_0);
addCfg(list, CONFIG_MIC_NOISE, String.valueOf(true), Configuration.Type.BOOL, "Whether noise suppression is preferred and/or required.", VER_5_0_0);
addCfg(list, CONFIG_DISPLAY_NAME_EDITABLE, String.valueOf(false), Configuration.Type.BOOL, "Is user will be able to edit his/her display name (default false).", "4.0.7");
addCfg(list, CONFIG_KEYCODE_QUICKPOLL, "Ctrl+Alt+KeyQ", Configuration.Type.HOTKEY
, "A hot key code to start quick poll", "4.0.10");
addCfg(list, CONFIG_AUTO_OPEN_SHARING, String.valueOf(false), Configuration.Type.BOOL, "Whether shared screen should be auto-opened.", VER_5_0_0);
addCfg(list, CONFIG_KEYCODE_ARRANGE_RESIZE, "Ctrl+Shift+KeyA", Configuration.Type.HOTKEY
, "A hot key code to arrange video windows bottom-to-top with resize to 120x90", VER_5_0_0);
final String cspMore = ", more info: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy";
addCfg(list, CONFIG_CSP_FONT, DEFAULT_CSP_FONT, Configuration.Type.STRING, String.format("Value for 'font-src' directive of 'Content-Security-Policy' header (default: %s)"
+ cspMore, DEFAULT_CSP_FONT), VER_5_0_0);
addCfg(list, CONFIG_CSP_FRAME, SELF.getValue(), Configuration.Type.STRING, String.format("Value for 'frame-src' directive of 'Content-Security-Policy' header (default: %s)"
+ cspMore, SELF), VER_5_0_0);
addCfg(list, CONFIG_CSP_IMAGE, DEFAULT_CSP_IMAGE, Configuration.Type.STRING, String.format("Value for 'image-src' directive of 'Content-Security-Policy' header (default: %s)"
+ cspMore, DEFAULT_CSP_IMAGE), VER_5_0_0);
addCfg(list, CONFIG_CSP_MEDIA, SELF.getValue(), Configuration.Type.STRING, String.format("Value for 'media-src' directive of 'Content-Security-Policy' header (default: %s)"
+ cspMore, SELF), VER_5_0_0);
addCfg(list, CONFIG_CSP_SCRIPT, STRICT_DYNAMIC.getValue(), Configuration.Type.STRING, String.format("Value for 'script-src' directive of 'Content-Security-Policy' header (default: %s)"
+ cspMore, STRICT_DYNAMIC), VER_5_0_0);
addCfg(list, CONFIG_CSP_STYLE, DEFAULT_CSP_STYLE, Configuration.Type.STRING, String.format("Value for 'style-src' directive of 'Content-Security-Policy' header (default: %s)"
+ cspMore, DEFAULT_CSP_STYLE), VER_5_0_0);
addCfg(list, CONFIG_SMTP_SSL, String.valueOf(false), Configuration.Type.BOOL, "Enable SSL", VER_5_0_0);
return list;
}
public void loadConfiguration(InstallationConfig cfg) {
for (Configuration c : initialCfgs(cfg)) {
cfgDao.update(c, null);
}
log.debug("Configurations ADDED");
}
private Room createRoom(String name, Room.Type type, long capacity, boolean isPublic, Long groupId) {
Room r = new Room();
r.setName(name);
r.setComment("");
r.setInserted(new Date());
r.setCapacity(capacity);
r.setType(type);
r.setIspublic(isPublic);
r.setAllowUserQuestions(true);
r.setAudioOnly(false);
r.setAppointment(false);
r.setDemoRoom(false);
r.setDemoTime(null);
r.hide(RoomElement.MICROPHONE_STATUS);
r.setModerated(false);
r.setDeleted(false);
r.setClosed(false);
r.setRedirectURL(null);
r.setOwnerId(null);
r.setWaitRecording(false);
r.setAllowRecording(true);
if (groupId != null) {
r.addGroup(groupDao.get(groupId));
}
r = roomDao.update(r, null);
return r;
}
public void loadDefaultRooms(boolean createRooms, long langId) {
if (createRooms) {
createRoom(LabelDao.getString("install.room.public.interview", langId), Type.INTERVIEW, 16L, true, null);
createRoom(LabelDao.getString("install.room.public.conference", langId), Type.CONFERENCE, 32L, true, null);
Room r = createRoom(LabelDao.getString("install.room.public.video.only", langId), Type.CONFERENCE, 32L, true, null);
r.hide(RoomElement.WHITEBOARD);
roomDao.update(r, null);
createRoom(LabelDao.getString("install.room.public.video.wb", langId), Type.CONFERENCE, 32L, true, null);
createRoom(LabelDao.getString("install.room.public.presentation", langId), Type.PRESENTATION, 100L, true, null);
r = createRoom(LabelDao.getString("install.room.presentation.micro", langId), Type.PRESENTATION, 100L, true, null);
r.getHiddenElements().clear();
roomDao.update(r, null);
r = createRoom(LabelDao.getString("install.room.conference.micro", langId), Type.CONFERENCE, 32L, true, null);
r.getHiddenElements().clear();
roomDao.update(r, null);
createRoom(LabelDao.getString("install.room.private.conference", langId), Type.CONFERENCE, 32L, false, 1L);
}
}
public void loadInitUserAndGroup(InstallationConfig cfg) throws Exception {
// Add default group
Group g = new Group();
g.setName(cfg.getGroup());
g.setInsertedby(1L);
g.setDeleted(false);
g.setInserted(new Date());
g = groupDao.update(g, null);
Configuration c = cfgDao.get(CONFIG_DEFAULT_GROUP_ID);
c.setValueN(g.getId());
cfgDao.update(c, null);
User u = getNewUserInstance(null);
u.setType(User.Type.USER);
u.getRights().add(Right.ADMIN);
u.getRights().add(Right.SOAP);
u.setLogin(cfg.getUsername());
u.setFirstname("firstname");
u.setLastname("lastname");
u.getAddress().setEmail(cfg.getEmail());
u.addGroup(g);
u = userDao.update(u, cfg.getPassword(), -1L);
log.debug("Installation - User Added user-Id {}", u.getId());
if (u.getId() == null) {
throw new InstallException("Unable to add user");
}
}
public User createSystemUser(User u, String group, String login, String pass, boolean groupAdmin, Consumer<User> postprocess) throws Exception {
GroupUser gu = new GroupUser(groupDao.get(group), u);
gu.setModerator(groupAdmin);
u.getGroupUsers().add(gu);
u.setLogin(login);
if (postprocess != null) {
postprocess.accept(u);
}
return userDao.update(u, pass, null);
}
public void loadInitialOAuthServers() {
// Yandex
oauthDao.update(new OAuthServer()
.setName("Yandex")
.setIconUrl("https://yandex.st/morda-logo/i/favicon.ico")
.setEnabled(false)
.setClientId(CLIENT_PLACEHOLDER)
.setClientSecret(SECRET_PLACEHOLDER)
.setRequestKeyUrl("https://oauth.yandex.ru/authorize?response_type=code&client_id={$client_id}")
.setRequestTokenUrl("https://oauth.yandex.ru/token")
.setRequestTokenMethod(RequestTokenMethod.POST)
.setRequestTokenAttributes("grant_type=authorization_code&code={$code}&client_id={$client_id}&client_secret={$client_secret}")
.setRequestInfoUrl("https://login.yandex.ru/info?format=json&oauth_token={$access_token}")
.addMapping(PARAM_LOGIN, "login")
.addMapping(PARAM_EMAIL, "default_email")
.addMapping(PARAM_FNAME, FNAME_PARAM)
.addMapping(PARAM_LNAME, LNAME_PARAM), null);
// Google
oauthDao.update(new OAuthServer()
.setName("Google")
.setIconUrl("https://www.google.com/images/google_favicon_128.png")
.setEnabled(false)
.setClientId(CLIENT_PLACEHOLDER)
.setClientSecret(SECRET_PLACEHOLDER)
.setRequestKeyUrl("https://accounts.google.com/o/oauth2/auth?redirect_uri={$redirect_uri}&response_type=code&client_id={$client_id}"
+ "&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile")
.setRequestTokenUrl("https://accounts.google.com/o/oauth2/token")
.setRequestTokenMethod(RequestTokenMethod.POST)
.setRequestTokenAttributes("code={$code}&client_id={$client_id}&client_secret={$client_secret}&redirect_uri={$redirect_uri}&grant_type=authorization_code")
.setRequestInfoUrl("https://www.googleapis.com/oauth2/v1/userinfo?access_token={$access_token}")
.setRequestInfoMethod(RequestInfoMethod.GET)
.addMapping(PARAM_LOGIN, EMAIL_PARAM)
.addMapping(PARAM_EMAIL, EMAIL_PARAM)
.addMapping(PARAM_FNAME, "given_name")
.addMapping(PARAM_LNAME, "family_name"), null);
// Facebook
oauthDao.update(new OAuthServer()
.setName("Facebook")
.setIconUrl("https://www.facebook.com/images/fb_icon_325x325.png")
.setEnabled(false)
.setClientId(CLIENT_PLACEHOLDER)
.setClientSecret(SECRET_PLACEHOLDER)
.setRequestKeyUrl("https://www.facebook.com/v4.0/dialog/oauth?client_id={$client_id}&redirect_uri={$redirect_uri}&scope=email")
.setRequestTokenUrl("https://graph.facebook.com/v4.0/oauth/access_token")
.setRequestTokenMethod(RequestTokenMethod.POST)
.setRequestTokenAttributes("client_id={$client_id}&redirect_uri={$redirect_uri}&client_secret={$client_secret}&code={$code}")
.setRequestInfoUrl("https://graph.facebook.com/me?access_token={$access_token}&fields=id,first_name,last_name,email")
.setRequestInfoMethod(RequestInfoMethod.GET)
.addMapping(PARAM_LOGIN, "id")
.addMapping(PARAM_EMAIL, EMAIL_PARAM)
.addMapping(PARAM_FNAME, FNAME_PARAM)
.addMapping(PARAM_LNAME, LNAME_PARAM), null);
// VK
oauthDao.update(new OAuthServer()
.setName("VK")
.setIconUrl("https://vk.com/images/icons/pwa/apple/default.png")
.setEnabled(false)
.setClientId(CLIENT_PLACEHOLDER)
.setClientSecret(SECRET_PLACEHOLDER)
.setRequestKeyUrl("https://oauth.vk.com/authorize?client_id={$client_id}&scope=email&redirect_uri={$redirect_uri}&response_type=code&v=5.68")
.setRequestTokenUrl("https://oauth.vk.com/access_token")
.setRequestTokenMethod(RequestTokenMethod.POST)
.setRequestTokenAttributes("client_id={$client_id}&client_secret={$client_secret}&code={$code}&redirect_uri={$redirect_uri}")
.setRequestInfoUrl("https://api.vk.com/method/users.get?&v=5.92&user_ids={$user_id}&access_token={$access_token}&fields=id,first_name,last_name,email&name_case=nom")
.setRequestInfoMethod(RequestInfoMethod.GET)
.addMapping(PARAM_LOGIN, "id")
.addMapping(PARAM_EMAIL, EMAIL_PARAM)
.addMapping(PARAM_FNAME, FNAME_PARAM)
.addMapping(PARAM_LNAME, LNAME_PARAM), null);
}
// ------------------------------------------------------------------------------
private void checkInstalled(boolean force) {
// dummy check if installation was performed before
if (!force && userDao.count() > 0) {
log.debug("System contains users, no need to install data one more time.");
}
}
public void loadSystem(InstallationConfig cfg, boolean force) {
checkInstalled(force);
sipDao.delete();
progress = 20;
loadConfiguration(cfg);
progress = 40;
if (cfg.isCreateDefaultObjects()) {
loadInitialOAuthServers();
}
progress = 60;
}
public void loadAll(InstallationConfig cfg, boolean force) throws Exception {
checkInstalled(force);
loadSystem(cfg, force);
loadInitUserAndGroup(cfg);
progress = 80;
loadDefaultRooms(cfg.isCreateDefaultObjects(), cfg.getDefaultLangId());
progress = 100;
}
}