DocumentServer/ServerComponents/FileConverterUtils2/VariousUtils.cs
2015-04-28 19:22:25 +03:00

276 lines
12 KiB
C#

/*
* (c) Copyright Ascensio System SIA 2010-2015
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Caching;
using System.Web.Script.Serialization;
using System.Security.Cryptography;
using ASC.Common.Data;
namespace FileConverterUtils2
{
public class FileStatistic
{
private string m_sConnectionString = ConfigurationManager.AppSettings["utils.filestatistic.db.connectionstring"];
private IDbConnection GetDbConnection(string connectionStringName)
{
var cs = ConfigurationManager.ConnectionStrings[connectionStringName];
var dbProvider = System.Data.Common.DbProviderFactories.GetFactory(cs.ProviderName);
var connection = dbProvider.CreateConnection();
connection.ConnectionString = cs.ConnectionString;
return connection;
}
private DbManager GetDbManager(string connectionStringName)
{
var cs = ConfigurationManager.ConnectionStrings[connectionStringName];
if (!DbRegistry.IsDatabaseRegistered(connectionStringName))
{
DbRegistry.RegisterDatabase(connectionStringName, cs);
}
return new DbManager(connectionStringName);
}
public bool insert(string sAffiliateID, string sFileName, DateTime dtTime, string sTag)
{
bool bResult = true;
string sInsertSQL = string.Format("INSERT INTO file_statistic2 (fsc_affiliate, fsc_filename, fsc_time, fsc_tag) VALUES ('{0}', '{1}', '{2}', '{3}')",
sAffiliateID, Utils.MySqlEscape(sFileName, m_sConnectionString), dtTime.ToString(Constants.mc_sDateTimeFormat), sTag);
using (IDbConnection sqlCon = GetDbConnection(m_sConnectionString))
{
try
{
sqlCon.Open();
using (IDbCommand oInsertCommand = sqlCon.CreateCommand())
{
oInsertCommand.CommandText = sInsertSQL;
oInsertCommand.ExecuteNonQuery();
}
}
catch
{
bResult = false;
}
}
return bResult;
}
}
public static class Signature
{
private const double mc_dKeyDateEpsilon = 300;
public static string Create<T>(T obj, string secret)
{
var serializer = new JavaScriptSerializer();
var str = serializer.Serialize(obj);
var payload = GetHashBase64(str + secret) + "?" + str;
return HttpServerUtility.UrlTokenEncode(Encoding.UTF8.GetBytes(payload));
}
private static string GetHashBase64(string str)
{
return Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(str)));
}
private static string GetHashBase64MD5(string str)
{
return Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str)));
}
private static T Read<T>(string signature, string secret, bool bUseSecret)
{
try
{
var payloadParts = Encoding.UTF8.GetString(HttpServerUtility.UrlTokenDecode(signature)).Split('?');
if (false == bUseSecret || (GetHashBase64(payloadParts[1] + secret) == payloadParts[0]) || (GetHashBase64MD5(payloadParts[1] + secret) == payloadParts[0]))
{
return new JavaScriptSerializer().Deserialize<T>(payloadParts[1]);
}
}
catch (Exception)
{
}
return default(T);
}
public static ErrorTypes isAccept(string strVKey, string strCurrentKey, bool bCheckIP, string strCurrentIp)
{
try
{
string strKeyId = null;
System.Collections.Generic.Dictionary<string, object> arrElements = null;
ASC.Core.Billing.PaymentOffice oPaymentOffice = null;
try
{
getVKeyStringParam(strVKey, ConfigurationSettings.AppSettings["keyKeyID"], out strKeyId);
oPaymentOffice = getPaymentOffice(strKeyId);
var vElement = Read<object>(strVKey, oPaymentOffice.Key2, true);
if (null == vElement)
return ErrorTypes.VKeyEncrypt;
arrElements = (System.Collections.Generic.Dictionary<string, object>)vElement;
}
catch
{
return ErrorTypes.VKeyEncrypt;
}
object objValue = null;
DateTime oDateTimeNow = DateTime.UtcNow;
if (false == ( (oDateTimeNow - oPaymentOffice.EndDate).TotalSeconds < mc_dKeyDateEpsilon))
return ErrorTypes.VKeyKeyExpire;
int nUserCount = 0;
arrElements.TryGetValue(ConfigurationSettings.AppSettings["keyUserCount"], out objValue);
if (null != objValue)
nUserCount = (int)objValue;
if (nUserCount > oPaymentOffice.UsersCount)
return ErrorTypes.VKeyUserCountExceed;
if (bCheckIP)
{
arrElements.TryGetValue(ConfigurationSettings.AppSettings["keyIp"], out objValue);
if (null == objValue)
return ErrorTypes.VKey;
string strUserIp = (string)objValue;
if (strCurrentIp != strUserIp)
return ErrorTypes.VKey;
}
arrElements.TryGetValue(ConfigurationSettings.AppSettings["keyKey"], out objValue);
if (null == objValue)
return ErrorTypes.VKey;
string strKey = (string)objValue;
if (strCurrentKey.Length > strKey.Length)
{
int nIndexStartFormat = strCurrentKey.LastIndexOf(".");
if (-1 != nIndexStartFormat)
strCurrentKey = strCurrentKey.Substring(0, nIndexStartFormat);
}
if (strKey != strCurrentKey && strKey + "_temp" != strCurrentKey)
return ErrorTypes.VKey;
arrElements.TryGetValue(ConfigurationSettings.AppSettings["keyDate"], out objValue);
if (null != objValue)
{
DateTime oDateTimeKey = (DateTime)objValue;
DateTime oDateTimeKeyAddHour = oDateTimeKey;
oDateTimeKeyAddHour = oDateTimeKeyAddHour.AddHours(double.Parse(ConfigurationSettings.AppSettings["keyDateInterval"] ?? "1", Constants.mc_oCultureInfo));
if ((oDateTimeKey - oDateTimeNow).TotalSeconds > mc_dKeyDateEpsilon)
return ErrorTypes.VKeyTimeIncorrect;
if( mc_dKeyDateEpsilon < (oDateTimeNow - oDateTimeKeyAddHour).TotalSeconds)
return ErrorTypes.VKeyTimeExpire;
}
}
catch { return ErrorTypes.VKey; }
return ErrorTypes.NoError;
}
public static void getVKeyParams(string strVKey, out bool bPaid)
{
bPaid = true;
try
{
string strKeyId = null;
getVKeyStringParam(strVKey, ConfigurationSettings.AppSettings["keyKeyID"], out strKeyId);
ASC.Core.Billing.PaymentOffice oPaymentOffice = getPaymentOffice(strKeyId);
var vElement = Read<object>(strVKey, oPaymentOffice.Key2, true);
if (null == vElement)
return;
System.Collections.Generic.Dictionary<string, object> arrElements = (System.Collections.Generic.Dictionary<string, object>)vElement;
object objValue = null;
arrElements.TryGetValue(ConfigurationSettings.AppSettings["keyPaid"], out objValue);
if (null == objValue)
return;
bPaid = (bool)objValue;
}
catch { }
}
public static void getVKeyStringParam(string strVKey, string strParamName, out string strParam)
{
strParam = null;
try
{
var vElement = Read<object>(strVKey, null, false);
if (null == vElement)
return;
System.Collections.Generic.Dictionary<string, object> arrElements = (System.Collections.Generic.Dictionary<string, object>)vElement;
object objValue = null;
arrElements.TryGetValue(strParamName, out objValue);
if (null == objValue)
return;
strParam = (string)objValue;
}
catch { }
}
public static ASC.Core.Billing.PaymentOffice getPaymentOffice(string strKeyId)
{
ASC.Core.Billing.PaymentOffice oPaymentOffice = null;
Cache oCache = HttpRuntime.Cache;
object oCacheVal = oCache.Get(strKeyId);
if (null == oCacheVal)
{
ASC.Core.Billing.BillingClient oBillingClient = new ASC.Core.Billing.BillingClient();
oPaymentOffice = oBillingClient.GetPaymentOffice(strKeyId);
string sWebCacheExpireSeconds = ConfigurationSettings.AppSettings["WebCacheExpireSeconds"];
oCache.Add(strKeyId, oPaymentOffice, null, DateTime.Now.AddSeconds(int.Parse(sWebCacheExpireSeconds)), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}
else
oPaymentOffice = oCacheVal as ASC.Core.Billing.PaymentOffice;
return oPaymentOffice;
}
}
}