/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.util; import java.util.Locale; import java.util.StringTokenizer; import java.util.zip.CRC32; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.cayenne.DataRow; import org.apache.commons.codec.binary.Base64; import org.apache.jetspeed.capability.CapabilityMap; import org.apache.jetspeed.capability.CapabilityMapFactory; import org.apache.jetspeed.om.profile.Entry; import org.apache.jetspeed.om.profile.Portlets; import org.apache.jetspeed.om.registry.ClientRegistry; import org.apache.jetspeed.om.registry.MediaTypeEntry; import org.apache.jetspeed.services.Registry; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.services.rundata.JetspeedRunData; import org.apache.jetspeed.util.MimeType; import org.apache.jetspeed.util.template.JetspeedLink; import org.apache.jetspeed.util.template.JetspeedLinkFactory; import org.apache.turbine.util.DynamicURI; import org.apache.turbine.util.RunData; import com.aimluck.eip.cayenne.om.account.EipMCompany; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.common.ALEipUser; import com.aimluck.eip.services.config.ALConfigHandler.Property; import com.aimluck.eip.services.config.ALConfigService; /** * */ public class ALCellularUtils { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ALCellularUtils.class.getName()); /** * 携帯電話の固有 ID によるログイン認証時のアクセス URL に付加する値を取得します。 * * @param username * @return */ public static String getCheckValueForCellLogin(String username, String userid) { if (username == null || username.length() == 0 || userid == null) { return ""; } String marge = username + userid; CRC32 crc32 = new CRC32(); crc32.update(marge.getBytes()); long value = crc32.getValue(); String base64value = null; try { base64value = new String(Base64.encodeBase64(String.valueOf(value).getBytes())); } catch (Exception e) { } return (base64value == null) ? "" : base64value.toLowerCase(); } /** * 携帯電話の固有 ID を取得します。 * * @param rundata * @return */ public static String getCellularUid(RunData rundata) { String password = ""; JetspeedRunData data = (JetspeedRunData) rundata; String useragent = data.getRequest().getHeader("User-Agent"); if (useragent != null && useragent.length() > 0) { useragent = useragent.trim(); CapabilityMap cm = CapabilityMapFactory.getCapabilityMap(useragent); MimeType mime = cm.getPreferredType(); if (mime != null) { MediaTypeEntry media = (MediaTypeEntry) Registry.getEntry(Registry.MEDIA_TYPE, cm .getPreferredMediaType()); if ("docomo_imode".equals(media.getName())) { int lastindex = useragent.lastIndexOf("ser"); if (lastindex >= 0) { password = useragent.substring(lastindex, useragent.length()); } } else if ("docomo_foma".equals(media.getName())) { StringTokenizer st = new StringTokenizer(useragent, ";"); String token = null; while (st.hasMoreTokens()) { if ((token = st.nextToken()).startsWith("ser")) { password = token.trim(); break; } } } else if ("au".equals(media.getName())) { String header = data.getRequest().getHeader("x-up-subno"); if (header != null && header.length() > 0) { int index = header.indexOf("_"); if (index >= 0) { password = header.substring(0, index); } } } else if ("vodafone".equals(media.getName())) { int index = useragent.indexOf("SN"); if (index >= 0) { int delta = -1; if (useragent.startsWith("J-PHONE/4")) { delta = 10; } else if (useragent.startsWith("J-PHONE/5")) { delta = 15; } else if (useragent.startsWith("Vodafone")) { delta = 15; } else if (useragent.startsWith("SoftBank")) { delta = 15; } if (index >= 0 && delta > 0) { password = useragent.substring(index, index + 2 + delta); } } else { String jphoneUid = data.getRequest().getHeader("x-jphone-uid"); if (jphoneUid != null) { password = jphoneUid; } } } } } return password; } /** * アクセス元の端末が携帯電話であるかを判定します。 * * @param data * @return */ public static boolean isCellularPhone(RunData data) { boolean isCellularPhone = false; CapabilityMap cm = CapabilityMapFactory.getCapabilityMap(data.getRequest().getHeader( "User-Agent")); MimeType mime = cm.getPreferredType(); if (mime != null) { MediaTypeEntry media = (MediaTypeEntry) Registry.getEntry(Registry.MEDIA_TYPE, cm .getPreferredMediaType()); String mediatype = media.getName(); if ("docomo_imode".equals(mediatype) || "docomo_foma".equals(mediatype) || "au".equals(mediatype) || "vodafone".equals(mediatype)) { isCellularPhone = true; } } return isCellularPhone; } public static boolean isSmartPhone(RunData data) { String client = ((ClientRegistry) Registry.get(Registry.CLIENT)).findEntry( data.getUserAgent().trim()).getManufacturer(); String peid = data.getParameters().getString("js_peid"); if (peid == null && "IPHONE".equals(client)) { return true; } return false; } /** * データベースの検索結果から、指定したキーに対応する値を取得します。 * * @param dataRow * @param key * @return */ public static Object getObjFromDataRow(DataRow dataRow, String key) { String lowerKey = key.toLowerCase(Locale.ENGLISH); if (dataRow.containsKey(lowerKey)) { return dataRow.get(lowerKey); } else { return dataRow.get(key.toUpperCase(Locale.ENGLISH)); } } /** * 携帯電話からのアクセス用 URL を取得します。 * * @param useraddr * @return */ public static String getCellularUrl(RunData rundata, ALEipUser eipUser) { String url; String loginUrl = ALConfigService.get(Property.EXTERNAL_LOGIN_URL); if (loginUrl != null && loginUrl.length() > 0) { return loginUrl; } String key = eipUser.getName().getValue() + "_" + getCheckValueForCellLogin(eipUser.getName().getValue(), eipUser .getUserId() .toString()); EipMCompany record = ALEipUtils.getEipMCompany("1"); String domain = ALServletUtils.getAccessUrl(record.getIpaddress(), record .getPort() .intValue(), true); if (domain != null && domain.length() > 0) { url = domain + "?key=" + key; } else { url = ""; } return url; } /** * 携帯電話からのアクセス用 key を取得します。 * * @param useraddr * @return */ public static String getCellularKey(ALEipUser eipUser) { String key = eipUser.getName().getValue() + "_" + getCheckValueForCellLogin(eipUser.getName().getValue(), eipUser .getUserId() .toString()); return key; } /** * Triple DES で文字列を暗号化します。 * * @param plain * 暗号化対象文字列 * @return 暗号化文字列 * @throws Exception * 暗号化時の例外 */ public static String crypt3Des(String key, String plain) throws Exception { String KEY_CRPTY_ALGORITHM = "DESede"; // 24文字までをキーにする。 byte[] tripleDesKeyData = new byte[24]; byte[] kyebyte = key.getBytes(); int len = kyebyte.length; for (int i = 0; i < len; i++) { tripleDesKeyData[i] = kyebyte[i]; } SecretKey secretKey = new SecretKeySpec(tripleDesKeyData, KEY_CRPTY_ALGORITHM); Cipher cipher = Cipher.getInstance(KEY_CRPTY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedMessage = cipher.doFinal(plain.getBytes()); return new String(Base64.encodeBase64(encryptedMessage)); } /** * Triple DES で文字列を復号します。 * * @param plain * 復号対象文字列 * @return 復号文字列 * @throws Exception * 復号時の例外 */ @SuppressWarnings("unused") private static String decrypt3Des(String key, String plain) throws Exception { String KEY_CRPTY_ALGORITHM = "DESede"; // 24文字までをキーにする。 byte[] tripleDesKeyData = new byte[24]; byte[] kyebyte = key.getBytes(); int len = kyebyte.length; for (int i = 0; i < len; i++) { tripleDesKeyData[i] = kyebyte[i]; } SecretKey secretKey = new SecretKeySpec(tripleDesKeyData, KEY_CRPTY_ALGORITHM); Cipher cipher = Cipher.getInstance(KEY_CRPTY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKey); Base64 decoder = new Base64(); byte[] decParam = decoder.decode(plain.trim().getBytes()); return String.valueOf(cipher.doFinal(decParam)); } /** * 指定したエントリー名のポートレットへの URI を取得します。 * * @param rundata * @param portletEntryName * PSML ファイルに記述されているタグ entry の要素 parent * @return */ public static String getPortletURIForCell(RunData rundata, String portletEntryId) { try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Entry[] entries = portlets.getEntriesArray(); if (entries == null || entries.length <= 0) { return null; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletEntryId)) { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getLink( JetspeedLink.CURRENT, null, null, JetspeedLink.CURRENT, null); duri = duri.addPathInfo( JetspeedResources.PATH_PORTLETID_KEY, entries[j].getId()).addQueryData( JetspeedResources.PATH_ACTION_KEY, "controls.Maximize").addQueryData( ALEipConstants.MODE, ALEipConstants.MODE_LIST); return duri.toString(); } } } catch (Exception ex) { logger.error("ALCellularUtils.getPortletURIForCell", ex); return null; } return null; } }