using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Utility.Utils.DbUtils;
using Utility.Utils.ConvertUtils;
using System.Data;
using System.IO;
using Utility.Utils.OfficeUtils;
using Utility.Utils.FileUtils;
using System.Xml;
using System.Text.RegularExpressions;
namespace LayerWebservice
{
///
/// LayerSynchro 的摘要说明
///
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class LayerSynchro : System.Web.Services.WebService
{
// [WebMethod]
// public string getDelLayer()
// {
// string resultStr = "{\"error\":\"true\"}";
// DataConvertor dc = new DataConvertor();
// string connstr = System.Configuration.ConfigurationManager.AppSettings["connstr"].ToString();
// string shapeOwner = System.Configuration.ConfigurationManager.AppSettings["shapeOwner"].ToString();
// string LogicOwner = System.Configuration.ConfigurationManager.AppSettings["LogicOwner"].ToString();
// string dbtype = System.Configuration.ConfigurationManager.AppSettings["database"].ToString();
// string f_table_schema = System.Configuration.ConfigurationManager.AppSettings["f_table_schema"].ToString();
// DbOperator dbOpe = new DbOperator(connstr, dbtype);
// if (!dbOpe.Connect())
// {
// return resultStr;
// }
// string sql = "SELECT a.[f_table_name] as 图层名称 FROM [" + shapeOwner + "].[sde].[SDE_geometry_columns] a,[" + shapeOwner + "].[sde].[SDE_layers] b where a.f_table_name = b.table_name and a.geometry_type in (1,9,11) and a.f_table_schema='" + f_table_schema + "' and b.layer_config<>'DATA_DICTIONARY' order by geometry_type";
// DataTable dt_sde = dbOpe.Select(sql);
// if (dt_sde == null )
// {
// return resultStr;
// }
// sql = "SELECT [LAYER_ID] ,[LAYER_NAME] as 图层名称 FROM [" + LogicOwner + "].[GS_LOGIC].[T_LAYERS]";
// DataTable dt_logic = dbOpe.Select(sql);
// if (dt_logic == null )
// {
// return resultStr;
// }
// for (int j = dt_logic.Rows.Count - 1; j >= 0; j--)
// {
// bool f = true;
// for (int i = 0; i < dt_sde.Rows.Count; i++)
// {
// if (dt_sde.Rows[i]["图层名称"].ToString() == dt_logic.Rows[j]["图层名称"].ToString())
// {
// f = false;
// break;
// }
// }
// if (!f)
// {
// dt_logic.Rows.RemoveAt(j);
// }
// }
// dbOpe.Close();
// return dc.DataTable2JSON(dt_logic).ToString();
// }
public bool IsNumAndEn(string input)
{
string pattern = @"^[A-Za-z0-9]+$";
Regex regex = new Regex(pattern);
return regex.IsMatch(input);
}
public bool IsNumAndEnAndCh(string input)
{
string pattern = @"^[A-Za-z0-9\u4e00-\u9fa5]+$";
Regex regex = new Regex(pattern);
return regex.IsMatch(input);
}
private const string StrRegex = @"-|;|,|/|(|)|[|]|}|{|%|@|*|!|'";
private const string StrKeyWord = @"select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user|""|or|and";
///
/// 检查_sword是否包涵SQL关键字
///
/// 需要检查的字符串
/// 存在SQL注入关键字时返回 true,否则返回 false
public bool CheckKeyWord(string _sWord)
{
bool result = false;
//模式1 : 对应Sql注入的可能关键字
string[] patten1 = StrKeyWord.Split('|');
//模式2 : 对应Sql注入的可能特殊符号
string[] patten2 = StrRegex.Split('|');
//开始检查 模式1:Sql注入的可能关键字 的注入情况
foreach (string sqlKey in patten1)
{
if (_sWord.IndexOf(" " + sqlKey) >= 0 || _sWord.IndexOf(sqlKey + " ") >= 0)
{
//只要存在一个可能出现Sql注入的参数,则直接退出
result = true;
break;
}
}
//开始检查 模式1:Sql注入的可能特殊符号 的注入情况
foreach (string sqlKey in patten2)
{
if (_sWord.IndexOf(sqlKey) >= 0)
{
//只要存在一个可能出现Sql注入的参数,则直接退出
result = true;
break;
}
}
return result;
}
public string getLayerAuthor(string dep)
{
string lays = "";
string connstr = System.Configuration.ConfigurationManager.AppSettings["connstr"].ToString();
string LogicOwner = System.Configuration.ConfigurationManager.AppSettings["LogicOwner"].ToString();
string dbtype = System.Configuration.ConfigurationManager.AppSettings["database"].ToString();
DbOperator dbOpe = new DbOperator(connstr, dbtype);
if (!dbOpe.Connect())
{
return "";
}
string sql = "select a.LAYER_NAME as 图层名称,a.LAYER_ID from [" + LogicOwner + "].[t_layers] a where a.DEPARTMENT ='" + dep + "' union " +
"select b.LAYER_NAME as 图层名称,b.LAYER_ID from [" + LogicOwner + "].[t_layers] b where b.LEVEL_ID = 1 and b.DEPARTMENT !='" + dep + "' union " +
"select f.LAYER_NAME as 图层名称,f.LAYER_ID from [" + LogicOwner + "].[t_layers] f,[" + LogicOwner + "].[t_resource_authorized] t " +
"where f.LAYER_ID = t.RELATED_ID and t.APPLY_DEPARTMENT ='" + dep + "' and t.authorized_type_id = '2' " +
"and t.AUTHORIZED_STATUS = '1' and f.LEVEL_ID = 2 and f.DEPARTMENT !='" + dep + "'";
DataTable dt_logic = dbOpe.Select(sql);
if (dt_logic != null || dt_logic.Rows.Count > 0)
{
for (int j = 0; j < dt_logic.Rows.Count; j++)
{
lays += dt_logic.Rows[j]["图层名称"].ToString() + ",";
}
lays = lays.Substring(0, lays.Length - 1);
}
dbOpe.Close();
return lays;
}
[WebMethod]
public string getMapAuthor(string serviceName,string dep,string username="",string userdep="")
{
if(!IsNumAndEn(serviceName) ||!IsNumAndEnAndCh(dep)||!IsNumAndEnAndCh(username)||!IsNumAndEnAndCh(userdep))
{
return "{\"success\":\"false\",\"Message\":\"参数不正确\"}";
}
string relatetab = "";
string relateLay = "";
string sqlays = "";
string result = "";
string connstr = System.Configuration.ConfigurationManager.AppSettings["connstr"].ToString();
string LogicOwner = System.Configuration.ConfigurationManager.AppSettings["LogicOwner"].ToString();
string dbtype = System.Configuration.ConfigurationManager.AppSettings["database"].ToString();
DbOperator dbOpe = new DbOperator(connstr, dbtype);
string insSQL = "";
string service_id = "";
string resultStr = "";
if (!dbOpe.Connect())
{
return "{\"success\":\"false\",\"Message\":\"数据库连接失败\"}";
}
string sql = "SELECT [NAME],[SERVICE_URL],[RELATE_LAYERS],[RELATE_TABLES],[SERVICE_ID] FROM [" +
LogicOwner + "].[T_SERVICE] where [TYPE_ID] = 2 and [NAME] = '" + serviceName +
"' and DEPARTMENT = '" + dep + "'";
DataTable dt_logic = dbOpe.Select(sql);
if (dt_logic != null && dt_logic.Rows.Count ==1)
{
relatetab = dt_logic.Rows[0]["RELATE_TABLES"].ToString();
relateLay = dt_logic.Rows[0]["RELATE_LAYERS"].ToString();
service_id = dt_logic.Rows[0]["SERVICE_ID"].ToString();
sqlays = getLayerAuthor(dep);
if (sqlays.Length > 0)
{
insSQL += "INSERT INTO [GS_LOGIC].[T_AUDIT]([AUDIT_TYPE],[RELATE_NAME],[VISIT_DATE],[DEPARTMENT],[USERNAME]) VALUES(1,'"
+ serviceName + "',getdate(),'" + userdep + "','" + username + "');";
string[] arrSq = sqlays.Split(',');
string[] arrRelateTab = relatetab.Split(',');
string[] arrRelateLay = relateLay.Split(',');
if (arrRelateTab.Length != arrRelateLay.Length)
{
resultStr = "{\"success\":\"false\",\"Message\":\"数据不匹配,建议重新发布服务\"}";
}
else
{
for (int i = 0; i < arrRelateTab.Length; i++)
{
string r = arrRelateTab[i];
foreach (string s in arrSq)
{
if (r == s)
{
insSQL += "INSERT INTO [GS_LOGIC].[T_AUDIT]([AUDIT_TYPE],[RELATE_NAME],[VISIT_DATE],[DEPARTMENT],[USERNAME]) VALUES(2,'"
+ r + "',getdate(),'" + userdep + "','" + username + "');";
result += arrRelateLay[i] + ",";
break;
}
}
}
if (result.Length > 0)
{
result = result.Substring(0, result.Length - 1);
dbOpe.Update(insSQL.Substring(0, insSQL.Length - 1), ";");
}
resultStr = "{\"success\":\"true\",\"Message\":\"" + result + "\"}";
}
}
else
{
resultStr = "{\"success\":\"true\",\"Message\":\"\"}";
}
}
else
{
resultStr = "{\"success\":\"false\",\"Message\":\"未获取该服务的授权\"}";
}
dbOpe.Close();
return resultStr;
}
}
}