001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.model.impl;
016    
017    import com.liferay.portal.kernel.bean.AutoEscape;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.io.ProtectedObjectInputStream;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.util.Base64;
024    import com.liferay.portal.kernel.util.CharPool;
025    import com.liferay.portal.kernel.util.PropsKeys;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.StringUtil;
028    import com.liferay.portal.kernel.util.Validator;
029    import com.liferay.portal.model.Account;
030    import com.liferay.portal.model.CacheField;
031    import com.liferay.portal.model.Company;
032    import com.liferay.portal.model.CompanyConstants;
033    import com.liferay.portal.model.Group;
034    import com.liferay.portal.model.LayoutSet;
035    import com.liferay.portal.model.Shard;
036    import com.liferay.portal.model.User;
037    import com.liferay.portal.model.VirtualHost;
038    import com.liferay.portal.service.AccountLocalServiceUtil;
039    import com.liferay.portal.service.GroupLocalServiceUtil;
040    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
041    import com.liferay.portal.service.ShardLocalServiceUtil;
042    import com.liferay.portal.service.UserLocalServiceUtil;
043    import com.liferay.portal.service.VirtualHostLocalServiceUtil;
044    import com.liferay.portal.util.PortalUtil;
045    import com.liferay.portal.util.PrefsPropsUtil;
046    import com.liferay.portal.util.PropsValues;
047    
048    import java.io.ByteArrayInputStream;
049    import java.io.IOException;
050    import java.io.InvalidClassException;
051    import java.io.ObjectInputStream;
052    import java.io.ObjectStreamClass;
053    
054    import java.security.Key;
055    import java.security.KeyRep;
056    
057    import java.util.Locale;
058    import java.util.TimeZone;
059    
060    /**
061     * @author Brian Wing Shun Chan
062     */
063    public class CompanyImpl extends CompanyBaseImpl {
064    
065            public CompanyImpl() {
066            }
067    
068            @Override
069            public int compareTo(Company company) {
070                    String webId1 = getWebId();
071                    String webId2 = company.getWebId();
072    
073                    if (webId1.equals(PropsValues.COMPANY_DEFAULT_WEB_ID)) {
074                            return -1;
075                    }
076                    else if (webId2.equals(PropsValues.COMPANY_DEFAULT_WEB_ID)) {
077                            return 1;
078                    }
079                    else {
080                            return webId1.compareTo(webId2);
081                    }
082            }
083    
084            @Override
085            public Account getAccount() throws PortalException, SystemException {
086                    return AccountLocalServiceUtil.getAccount(
087                            getCompanyId(), getAccountId());
088            }
089    
090            @Override
091            public String getAdminName() {
092                    return "Administrator";
093            }
094    
095            @Override
096            public String getAuthType() throws SystemException {
097                    return PrefsPropsUtil.getString(
098                            getCompanyId(), PropsKeys.COMPANY_SECURITY_AUTH_TYPE,
099                            PropsValues.COMPANY_SECURITY_AUTH_TYPE);
100            }
101    
102            @Override
103            public User getDefaultUser() throws PortalException, SystemException {
104                    return UserLocalServiceUtil.getDefaultUser(getCompanyId());
105            }
106    
107            @Override
108            public String getDefaultWebId() {
109                    return PropsValues.COMPANY_DEFAULT_WEB_ID;
110            }
111    
112            @Override
113            public String getEmailAddress() {
114    
115                    // Primary email address
116    
117                    return "admin@" + getMx();
118            }
119    
120            @Override
121            public Group getGroup() throws PortalException, SystemException {
122                    if (getCompanyId() > CompanyConstants.SYSTEM) {
123                            return GroupLocalServiceUtil.getCompanyGroup(getCompanyId());
124                    }
125    
126                    return new GroupImpl();
127            }
128    
129            @Override
130            public long getGroupId() throws PortalException, SystemException {
131                    Group group = getGroup();
132    
133                    return group.getGroupId();
134            }
135    
136            @Override
137            public Key getKeyObj() {
138                    if (_keyObj == null) {
139                            String key = getKey();
140    
141                            if (Validator.isBlank(key)) {
142                                    return _keyObj;
143                            }
144    
145                            try {
146                                    ObjectInputStream ois = new CompanyKeyObjectInputStream(key);
147    
148                                    _keyObj = (Key)ois.readObject();
149                            }
150                            catch (Exception e) {
151                                    _log.error(
152                                            "Unable to deserialize " + key +
153                                                    ", possible Java deserialization attack",
154                                            e);
155                            }
156                    }
157    
158                    return _keyObj;
159            }
160    
161            @Override
162            public Locale getLocale() throws PortalException, SystemException {
163                    return getDefaultUser().getLocale();
164            }
165    
166            @AutoEscape
167            @Override
168            public String getName() throws PortalException, SystemException {
169                    return getAccount().getName();
170            }
171    
172            @Override
173            public String getPortalURL(long groupId)
174                    throws PortalException, SystemException {
175    
176                    int portalPort = PortalUtil.getPortalPort(false);
177    
178                    String portalURL = PortalUtil.getPortalURL(
179                            getVirtualHostname(), portalPort, false);
180    
181                    if (groupId <= 0) {
182                            return portalURL;
183                    }
184    
185                    Group group = GroupLocalServiceUtil.getGroup(groupId);
186    
187                    if (group.hasPublicLayouts()) {
188                            LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
189                                    groupId, false);
190    
191                            if (Validator.isNotNull(layoutSet.getVirtualHostname())) {
192                                    portalURL = PortalUtil.getPortalURL(
193                                            layoutSet.getVirtualHostname(), portalPort, false);
194                            }
195                    }
196                    else if (group.hasPrivateLayouts()) {
197                            LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
198                                    groupId, true);
199    
200                            if (Validator.isNotNull(layoutSet.getVirtualHostname())) {
201                                    portalURL = PortalUtil.getPortalURL(
202                                            layoutSet.getVirtualHostname(), portalPort, false);
203                            }
204                    }
205    
206                    return portalURL;
207            }
208    
209            @Override
210            public String getShardName() throws PortalException, SystemException {
211                    Shard shard = ShardLocalServiceUtil.getShard(
212                            Company.class.getName(), getCompanyId());
213    
214                    return shard.getName();
215            }
216    
217            @Override
218            public String getShortName() throws PortalException, SystemException {
219                    return getName();
220            }
221    
222            @Override
223            public TimeZone getTimeZone() throws PortalException, SystemException {
224                    return getDefaultUser().getTimeZone();
225            }
226    
227            @Override
228            public String getVirtualHostname() {
229                    if (_virtualHostname != null) {
230                            return _virtualHostname;
231                    }
232    
233                    VirtualHost virtualHost = null;
234    
235                    try {
236                            virtualHost = VirtualHostLocalServiceUtil.fetchVirtualHost(
237                                    getCompanyId(), 0);
238                    }
239                    catch (Exception e) {
240                    }
241    
242                    if (virtualHost == null) {
243                            return StringPool.BLANK;
244                    }
245    
246                    _virtualHostname = virtualHost.getHostname();
247    
248                    return _virtualHostname;
249            }
250    
251            @Override
252            public boolean hasCompanyMx(String emailAddress) throws SystemException {
253                    emailAddress = StringUtil.toLowerCase(emailAddress.trim());
254    
255                    int pos = emailAddress.indexOf(CharPool.AT);
256    
257                    if (pos == -1) {
258                            return false;
259                    }
260    
261                    String mx = emailAddress.substring(pos + 1);
262    
263                    if (mx.equals(getMx())) {
264                            return true;
265                    }
266    
267                    String[] mailHostNames = PrefsPropsUtil.getStringArray(
268                            getCompanyId(), PropsKeys.ADMIN_MAIL_HOST_NAMES,
269                            StringPool.NEW_LINE, PropsValues.ADMIN_MAIL_HOST_NAMES);
270    
271                    for (int i = 0; i < mailHostNames.length; i++) {
272                            if (StringUtil.equalsIgnoreCase(mx, mailHostNames[i])) {
273                                    return true;
274                            }
275                    }
276    
277                    return false;
278            }
279    
280            @Override
281            public boolean isAutoLogin() throws SystemException {
282                    return PrefsPropsUtil.getBoolean(
283                            getCompanyId(), PropsKeys.COMPANY_SECURITY_AUTO_LOGIN,
284                            PropsValues.COMPANY_SECURITY_AUTO_LOGIN);
285            }
286    
287            @Override
288            public boolean isSendPassword() throws SystemException {
289                    return PrefsPropsUtil.getBoolean(
290                            getCompanyId(), PropsKeys.COMPANY_SECURITY_SEND_PASSWORD,
291                            PropsValues.COMPANY_SECURITY_SEND_PASSWORD);
292            }
293    
294            @Override
295            public boolean isSendPasswordResetLink() throws SystemException {
296                    return PrefsPropsUtil.getBoolean(
297                            getCompanyId(), PropsKeys.COMPANY_SECURITY_SEND_PASSWORD_RESET_LINK,
298                            PropsValues.COMPANY_SECURITY_SEND_PASSWORD_RESET_LINK);
299            }
300    
301            @Override
302            public boolean isSiteLogo() throws SystemException {
303                    return PrefsPropsUtil.getBoolean(
304                            getCompanyId(), PropsKeys.COMPANY_SECURITY_SITE_LOGO,
305                            PropsValues.COMPANY_SECURITY_SITE_LOGO);
306            }
307    
308            @Override
309            public boolean isStrangers() throws SystemException {
310                    return PrefsPropsUtil.getBoolean(
311                            getCompanyId(), PropsKeys.COMPANY_SECURITY_STRANGERS,
312                            PropsValues.COMPANY_SECURITY_STRANGERS);
313            }
314    
315            @Override
316            public boolean isStrangersVerify() throws SystemException {
317                    return PrefsPropsUtil.getBoolean(
318                            getCompanyId(), PropsKeys.COMPANY_SECURITY_STRANGERS_VERIFY,
319                            PropsValues.COMPANY_SECURITY_STRANGERS_VERIFY);
320            }
321    
322            @Override
323            public boolean isStrangersWithMx() throws SystemException {
324                    return PrefsPropsUtil.getBoolean(
325                            getCompanyId(), PropsKeys.COMPANY_SECURITY_STRANGERS_WITH_MX,
326                            PropsValues.COMPANY_SECURITY_STRANGERS_WITH_MX);
327            }
328    
329            @Override
330            public void setKey(String key) {
331                    _keyObj = null;
332    
333                    super.setKey(key);
334            }
335    
336            @Override
337            public void setKeyObj(Key keyObj) {
338                    _keyObj = keyObj;
339            }
340    
341            @Override
342            public void setVirtualHostname(String virtualHostname) {
343                    _virtualHostname = virtualHostname;
344            }
345    
346            @CacheField
347            private Key _keyObj;
348    
349            @CacheField
350            private String _virtualHostname;
351    
352            private static Log _log = LogFactoryUtil.getLog(CompanyImpl.class);
353    
354            class CompanyKeyObjectInputStream extends ProtectedObjectInputStream {
355    
356                    public CompanyKeyObjectInputStream(String key) throws IOException {
357                            super(new ByteArrayInputStream(Base64.decode(key)));
358                    }
359    
360                    @Override
361                    protected Class<?> doResolveClass(ObjectStreamClass objectStreamClass)
362                            throws ClassNotFoundException, IOException {
363    
364                            Class streamClass = super.doResolveClass(objectStreamClass);
365    
366                            if (streamClass == null) {
367                                    return null;
368                            }
369    
370                            if (_log.isDebugEnabled()) {
371                                    _log.debug("Deserializating " + streamClass);
372                            }
373    
374                            if ((streamClass.isArray() &&
375                                     streamClass.getComponentType().isPrimitive()) ||
376                                    Key.class.isAssignableFrom(streamClass) ||
377                                    KeyRep.class.isAssignableFrom(streamClass) ||
378                                    Enum.class.isAssignableFrom(streamClass)) {
379    
380                                    return streamClass;
381                            }
382    
383                            throw new InvalidClassException(
384                                    "Rejected resolving of illegal class " +
385                                            objectStreamClass.getName());
386                    }
387            }
388    
389    }