增加钉钉与飞信群机器人推送支持
This commit is contained in:
parent
e96c85cd55
commit
974d0e8543
@ -1,21 +1,13 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Common
|
namespace Inotify.Common
|
||||||
{
|
{
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
static int rep = 0;
|
private static int rep = 0;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// MD5加密字符串(32位大写)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="source">源字符串</param>
|
|
||||||
/// <returns>加密后的字符串</returns>
|
|
||||||
public static string ToMd5(this string source)
|
public static string ToMd5(this string source)
|
||||||
{
|
{
|
||||||
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
|
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
|
||||||
@ -32,7 +24,11 @@ namespace Inotify.Common
|
|||||||
|
|
||||||
public static string Base64Encode(this string source)
|
public static string Base64Encode(this string source)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(source)) return "";
|
if (string.IsNullOrEmpty(source))
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
byte[] bytes = (Encoding.UTF8.GetBytes(source));
|
byte[] bytes = (Encoding.UTF8.GetBytes(source));
|
||||||
return Convert.ToBase64String(bytes);
|
return Convert.ToBase64String(bytes);
|
||||||
|
|
||||||
@ -40,7 +36,11 @@ namespace Inotify.Common
|
|||||||
|
|
||||||
public static string Base64Decode(this string source)
|
public static string Base64Decode(this string source)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(source)) return "";
|
if (string.IsNullOrEmpty(source))
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
var bytes = Convert.FromBase64String(source);
|
var bytes = Convert.FromBase64String(source);
|
||||||
return System.Text.Encoding.Default.GetString(bytes);
|
return System.Text.Encoding.Default.GetString(bytes);
|
||||||
}
|
}
|
||||||
@ -67,5 +67,17 @@ namespace Inotify.Common
|
|||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long ToUTC(this DateTime time)
|
||||||
|
{
|
||||||
|
TimeSpan ts = time - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
||||||
|
return Convert.ToInt64(ts.TotalMilliseconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long ToUnix(this DateTime time)
|
||||||
|
{
|
||||||
|
var expiration = time.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
||||||
|
return (long)expiration.TotalSeconds;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,123 +6,128 @@ using Inotify.Sends.Products;
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Controllers
|
namespace Inotify.Controllers
|
||||||
{
|
{
|
||||||
|
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("/")]
|
[Route("/")]
|
||||||
public class BarkControlor : BaseControlor
|
public class BarkControlor : BaseControlor
|
||||||
{
|
{
|
||||||
[HttpGet, Route("Ping")]
|
[HttpGet, Route("Ping")]
|
||||||
public JsonResult Ping()
|
public JsonResult Ping()
|
||||||
{
|
{
|
||||||
return Me("pong");
|
return Me("pong");
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet, Route("Info")]
|
[HttpGet, Route("Info")]
|
||||||
public JsonResult Info()
|
public JsonResult Info()
|
||||||
{
|
{
|
||||||
var dateTime = System.IO.File.GetLastWriteTime(this.GetType().Assembly.Location);
|
var dateTime = System.IO.File.GetLastWriteTime(GetType().Assembly.Location);
|
||||||
var devices = DBManager.Instance.DBase.Query<SendAuthInfo>().Count();
|
var devices = DBManager.Instance.DBase.Query<SendAuthInfo>().Count();
|
||||||
return Json(new
|
return Json(new
|
||||||
{
|
{
|
||||||
version = "v2.0.1",
|
version = "v2.0.1",
|
||||||
build = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
|
build = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||||
arch = RuntimeInformation.OSDescription,
|
arch = RuntimeInformation.OSDescription,
|
||||||
commit = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(),
|
commit = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(),
|
||||||
devices
|
devices
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet, Route("Healthz")]
|
[HttpGet, Route("Healthz")]
|
||||||
|
|
||||||
public string Healthz()
|
public string Healthz()
|
||||||
{
|
{
|
||||||
return "ok";
|
return "ok";
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet, Route("Register")]
|
[HttpGet, Route("Register")]
|
||||||
public JsonResult Register(string? act, string? key, string? devicetoken, string? device_key) => !string.IsNullOrEmpty(device_key) ?
|
public JsonResult Register(string? act, string? key, string? devicetoken, string? device_key)
|
||||||
Register(device_key) : Register(act, key, devicetoken);
|
{
|
||||||
|
return !string.IsNullOrEmpty(device_key) ?
|
||||||
|
Register(device_key) : Register(act, key, devicetoken);
|
||||||
|
}
|
||||||
|
|
||||||
[HttpPost, Route("Register")]
|
[HttpPost, Route("Register")]
|
||||||
public JsonResult Register(string? act, string? device_key, string? device_token)
|
public JsonResult Register(string? act, string? device_key, string? device_token)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(act))
|
if (string.IsNullOrEmpty(act))
|
||||||
return Fail(400, "request bind failed : act is empty");
|
{
|
||||||
|
return Fail(400, "request bind failed : act is empty");
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(device_token))
|
if (string.IsNullOrEmpty(device_token))
|
||||||
return Fail(400, "request bind failed : device_token is empty");
|
{
|
||||||
|
return Fail(400, "request bind failed : device_token is empty");
|
||||||
|
}
|
||||||
|
|
||||||
var userInfo = DBManager.Instance.DBase.Query<SendUserInfo>().FirstOrDefault(e => e.Token == act);
|
var userInfo = DBManager.Instance.DBase.Query<SendUserInfo>().FirstOrDefault(e => e.Token == act);
|
||||||
if (userInfo == null)
|
if (userInfo == null)
|
||||||
{
|
{
|
||||||
return Fail(400, "request bind failed : act is not registered");
|
return Fail(400, "request bind failed : act is not registered");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BarkAuth barkAuth = null;
|
BarkAuth barkAuth = null;
|
||||||
SendAuthInfo barkSendAuthInfo = null;
|
SendAuthInfo barkSendAuthInfo = null;
|
||||||
var barkTemplateAttribute = typeof(BarkSendTemplate).GetCustomAttributes(typeof(SendMethodKeyAttribute), false).OfType<SendMethodKeyAttribute>().First();
|
var barkTemplateAttribute = typeof(BarkSendTemplate).GetCustomAttributes(typeof(SendMethodKeyAttribute), false).OfType<SendMethodKeyAttribute>().First();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(device_key))
|
if (!string.IsNullOrEmpty(device_key))
|
||||||
{
|
{
|
||||||
barkSendAuthInfo = DBManager.Instance.DBase.Query<SendAuthInfo>().FirstOrDefault(e => e.Key == device_key);
|
barkSendAuthInfo = DBManager.Instance.DBase.Query<SendAuthInfo>().FirstOrDefault(e => e.Key == device_key);
|
||||||
if (barkSendAuthInfo != null)
|
if (barkSendAuthInfo != null)
|
||||||
{
|
{
|
||||||
barkAuth = JsonConvert.DeserializeObject<BarkAuth>(barkSendAuthInfo.AuthData);
|
barkAuth = JsonConvert.DeserializeObject<BarkAuth>(barkSendAuthInfo.AuthData);
|
||||||
barkAuth.DeviceToken = device_token;
|
barkAuth.DeviceToken = device_token;
|
||||||
barkSendAuthInfo.AuthData = JsonConvert.SerializeObject(barkAuth);
|
barkSendAuthInfo.AuthData = JsonConvert.SerializeObject(barkAuth);
|
||||||
barkSendAuthInfo.ModifyTime = DateTime.Now;
|
barkSendAuthInfo.ModifyTime = DateTime.Now;
|
||||||
DBManager.Instance.DBase.Update(barkSendAuthInfo);
|
DBManager.Instance.DBase.Update(barkSendAuthInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (barkSendAuthInfo == null)
|
if (barkSendAuthInfo == null)
|
||||||
{
|
{
|
||||||
device_key = 16.GenerateCheckCode();
|
device_key = 16.GenerateCheckCode();
|
||||||
barkAuth = new BarkAuth() { DeviceKey = device_key, DeviceToken = device_token, IsArchive = "1", AutoMaticallyCopy = "1", Sound = "1107" };
|
barkAuth = new BarkAuth() { DeviceKey = device_key, DeviceToken = device_token, IsArchive = "1", AutoMaticallyCopy = "1", Sound = "1107" };
|
||||||
barkSendAuthInfo = new SendAuthInfo()
|
barkSendAuthInfo = new SendAuthInfo()
|
||||||
{
|
{
|
||||||
Name = barkTemplateAttribute.Name,
|
Name = barkTemplateAttribute.Name,
|
||||||
SendMethodTemplate = barkTemplateAttribute.Key,
|
SendMethodTemplate = barkTemplateAttribute.Key,
|
||||||
Key = device_key,
|
Key = device_key,
|
||||||
AuthData = JsonConvert.SerializeObject(barkAuth),
|
AuthData = JsonConvert.SerializeObject(barkAuth),
|
||||||
UserId = userInfo.Id,
|
UserId = userInfo.Id,
|
||||||
CreateTime = DateTime.Now,
|
CreateTime = DateTime.Now,
|
||||||
ModifyTime = DateTime.Now,
|
ModifyTime = DateTime.Now,
|
||||||
Active = true,
|
Active = true,
|
||||||
};
|
};
|
||||||
DBManager.Instance.DBase.Insert(barkSendAuthInfo);
|
DBManager.Instance.DBase.Insert(barkSendAuthInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Json(new
|
return Json(new
|
||||||
{
|
{
|
||||||
key = device_key,
|
key = device_key,
|
||||||
device_key = device_key,
|
device_key = device_key,
|
||||||
device_token = device_token
|
device_token = device_token
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet, Route("RegisterCheck")]
|
[HttpGet, Route("RegisterCheck")]
|
||||||
public JsonResult Register(string device_key)
|
public JsonResult Register(string device_key)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(device_key))
|
if (string.IsNullOrEmpty(device_key))
|
||||||
{
|
{
|
||||||
return Fail(400, "device key is empty");
|
return Fail(400, "device key is empty");
|
||||||
}
|
}
|
||||||
if (!DBManager.Instance.DBase.Query<SendAuthInfo>().Any(e => e.Key == device_key))
|
if (!DBManager.Instance.DBase.Query<SendAuthInfo>().Any(e => e.Key == device_key))
|
||||||
{
|
{
|
||||||
return Fail(400, "device not registered");
|
return Fail(400, "device not registered");
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK();
|
return OK();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Inotify.Common;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Controllers
|
namespace Inotify.Controllers
|
||||||
{
|
{
|
||||||
@ -70,18 +69,18 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
code = 200,
|
code = 200,
|
||||||
message = "sucess",
|
message = "sucess",
|
||||||
timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds
|
timestamp = DateTime.Now.ToUnix()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected JsonResult OK(object obj )
|
protected JsonResult OK(object obj)
|
||||||
{
|
{
|
||||||
return Json(new
|
return Json(new
|
||||||
{
|
{
|
||||||
code = 200,
|
code = 200,
|
||||||
message = "sucess",
|
message = "sucess",
|
||||||
data = obj ?? "",
|
data = obj ?? "",
|
||||||
timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds
|
timestamp = DateTime.Now.ToUnix()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,7 +90,7 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
code = 200,
|
code = 200,
|
||||||
message = message,
|
message = message,
|
||||||
timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds
|
timestamp = DateTime.Now.ToUnix()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +100,7 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
code = 404,
|
code = 404,
|
||||||
message = "failed",
|
message = "failed",
|
||||||
timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds
|
timestamp = DateTime.Now.ToUnix()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,9 +108,9 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
return Json(new
|
return Json(new
|
||||||
{
|
{
|
||||||
code= code,
|
code = code,
|
||||||
message = "failed",
|
message = "failed",
|
||||||
timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds
|
timestamp = DateTime.Now.ToUnix()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,9 +118,9 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
return new JsonResult(new
|
return new JsonResult(new
|
||||||
{
|
{
|
||||||
code=code,
|
code = code,
|
||||||
message=message,
|
message = message,
|
||||||
timestamp = (int)(DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds
|
timestamp = DateTime.Now.ToUnix()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,22 +5,16 @@ using Inotify.Sends;
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Microsoft.AspNetCore.Authentication;
|
using Microsoft.AspNetCore.Authentication;
|
||||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NPoco;
|
|
||||||
using System;
|
using System;
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Controllers
|
namespace Inotify.Controllers
|
||||||
{
|
{
|
||||||
@ -47,7 +41,10 @@ namespace Inotify.Controllers
|
|||||||
if (userInfo != null)
|
if (userInfo != null)
|
||||||
{
|
{
|
||||||
if (!userInfo.Active)
|
if (!userInfo.Active)
|
||||||
|
{
|
||||||
return Fail(401, "用户被禁用");
|
return Fail(401, "用户被禁用");
|
||||||
|
}
|
||||||
|
|
||||||
if (userInfo.Password == password.ToMd5())
|
if (userInfo.Password == password.ToMd5())
|
||||||
{
|
{
|
||||||
var token = GenToken(username);
|
var token = GenToken(username);
|
||||||
@ -97,13 +94,19 @@ namespace Inotify.Controllers
|
|||||||
string? avtar = null;
|
string? avtar = null;
|
||||||
string email = "";
|
string email = "";
|
||||||
if (res.Result.TryGetValue("login", out JToken? jToken))
|
if (res.Result.TryGetValue("login", out JToken? jToken))
|
||||||
|
{
|
||||||
githubUserName = jToken.ToString();
|
githubUserName = jToken.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
if (res.Result.TryGetValue("avatar_url", out jToken))
|
if (res.Result.TryGetValue("avatar_url", out jToken))
|
||||||
|
{
|
||||||
avtar = jToken.ToString();
|
avtar = jToken.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
if (res.Result.TryGetValue("email", out jToken))
|
if (res.Result.TryGetValue("email", out jToken))
|
||||||
|
{
|
||||||
email = jToken.ToString();
|
email = jToken.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
if (githubUserName != null && avtar != null)
|
if (githubUserName != null && avtar != null)
|
||||||
{
|
{
|
||||||
@ -114,7 +117,9 @@ namespace Inotify.Controllers
|
|||||||
user.Avatar = avtar;
|
user.Avatar = avtar;
|
||||||
DBManager.Instance.DBase.Update(user);
|
DBManager.Instance.DBase.Update(user);
|
||||||
if (!user.Active)
|
if (!user.Active)
|
||||||
|
{
|
||||||
return Fail(401, "用户被禁用");
|
return Fail(401, "用户被禁用");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,6 @@ using Inotify.Data;
|
|||||||
using Inotify.Sends;
|
using Inotify.Sends;
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Caching.Memory;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Inotify.Controllers
|
namespace Inotify.Controllers
|
||||||
{
|
{
|
||||||
@ -16,7 +14,10 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
if (DBManager.Instance.IsToken(token, out bool hasActive))
|
if (DBManager.Instance.IsToken(token, out bool hasActive))
|
||||||
{
|
{
|
||||||
if (!hasActive) return Fail(400, "you have no tunnel is acitve");
|
if (!hasActive)
|
||||||
|
{
|
||||||
|
return Fail(400, "you have no tunnel is acitve");
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(key))
|
if (!string.IsNullOrEmpty(key))
|
||||||
{
|
{
|
||||||
@ -41,7 +42,10 @@ namespace Inotify.Controllers
|
|||||||
Key = key,
|
Key = key,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (SendTaskManager.Instance.SendMessage(message)) return OK();
|
if (SendTaskManager.Instance.SendMessage(message))
|
||||||
|
{
|
||||||
|
return OK();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Fail(400, $"token:{token} is not registered");
|
return Fail(400, $"token:{token} is not registered");
|
||||||
|
@ -2,17 +2,11 @@
|
|||||||
using Inotify.Data.Models;
|
using Inotify.Data.Models;
|
||||||
using Inotify.Sends;
|
using Inotify.Sends;
|
||||||
using Inotify.Sends.Products;
|
using Inotify.Sends.Products;
|
||||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.Text.Json.Serialization;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Controllers
|
namespace Inotify.Controllers
|
||||||
{
|
{
|
||||||
@ -154,7 +148,10 @@ namespace Inotify.Controllers
|
|||||||
{
|
{
|
||||||
var userInfo = DBManager.Instance.GetUser(UserName);
|
var userInfo = DBManager.Instance.GetUser(UserName);
|
||||||
if (userInfo != null)
|
if (userInfo != null)
|
||||||
|
{
|
||||||
return OK(userInfo.Token);
|
return OK(userInfo.Token);
|
||||||
|
}
|
||||||
|
|
||||||
return Fail();
|
return Fail();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,7 @@ using Inotify.Data.Models.System;
|
|||||||
using Inotify.Sends;
|
using Inotify.Sends;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using NPoco;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Inotify.Controllers
|
namespace Inotify.Controllers
|
||||||
{
|
{
|
||||||
@ -30,7 +26,7 @@ namespace Inotify.Controllers
|
|||||||
githubClientID = SendCacheStore.GetSystemValue("githubClientID"),
|
githubClientID = SendCacheStore.GetSystemValue("githubClientID"),
|
||||||
githubClientSecret = SendCacheStore.GetSystemValue("githubClientSecret"),
|
githubClientSecret = SendCacheStore.GetSystemValue("githubClientSecret"),
|
||||||
githubEnable = githubEnable != "" && bool.Parse(githubEnable),
|
githubEnable = githubEnable != "" && bool.Parse(githubEnable),
|
||||||
barkKeyId= SendCacheStore.GetSystemValue("barkKeyId"),
|
barkKeyId = SendCacheStore.GetSystemValue("barkKeyId"),
|
||||||
barkTeamId = SendCacheStore.GetSystemValue("barkTeamId"),
|
barkTeamId = SendCacheStore.GetSystemValue("barkTeamId"),
|
||||||
barkPrivateKey = SendCacheStore.GetSystemValue("barkPrivateKey"),
|
barkPrivateKey = SendCacheStore.GetSystemValue("barkPrivateKey"),
|
||||||
});
|
});
|
||||||
@ -111,9 +107,13 @@ namespace Inotify.Controllers
|
|||||||
public IActionResult GetUsers(string? query, int page, int pageSize)
|
public IActionResult GetUsers(string? query, int page, int pageSize)
|
||||||
{
|
{
|
||||||
if (query == null)
|
if (query == null)
|
||||||
|
{
|
||||||
return OK(DBManager.Instance.DBase.Query<SendUserInfo>().ToPage(page, pageSize));
|
return OK(DBManager.Instance.DBase.Query<SendUserInfo>().ToPage(page, pageSize));
|
||||||
else return OK(DBManager.Instance.DBase.Query<SendUserInfo>().Where(e => e.UserName.Contains(query) || e.Email.Contains(query)).ToPage(page, pageSize));
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return OK(DBManager.Instance.DBase.Query<SendUserInfo>().Where(e => e.UserName.Contains(query) || e.Email.Contains(query)).ToPage(page, pageSize));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet, Route("GetSendInfos"), Authorize(Policys.Systems)]
|
[HttpGet, Route("GetSendInfos"), Authorize(Policys.Systems)]
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
using Inotify.Common;
|
using Inotify.Data.Models;
|
||||||
using Inotify.Data.Models;
|
|
||||||
using Inotify.Data.Models.System;
|
using Inotify.Data.Models.System;
|
||||||
using Inotify.Sends.Products;
|
|
||||||
using Microsoft.Data.Sqlite;
|
using Microsoft.Data.Sqlite;
|
||||||
using Microsoft.IdentityModel;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NPoco;
|
using NPoco;
|
||||||
using NPoco.Migrations;
|
using NPoco.Migrations;
|
||||||
@ -11,9 +8,7 @@ using NPoco.Migrations.CurrentVersion;
|
|||||||
using System;
|
using System;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net.Mail;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace Inotify.Data
|
namespace Inotify.Data
|
||||||
{
|
{
|
||||||
@ -35,7 +30,7 @@ namespace Inotify.Data
|
|||||||
|
|
||||||
public JwtInfo JWT
|
public JwtInfo JWT
|
||||||
{
|
{
|
||||||
get { return m_JWT; }
|
get => m_JWT;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
m_JWT = value;
|
m_JWT = value;
|
||||||
@ -53,7 +48,11 @@ namespace Inotify.Data
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (m_Instance == null) m_Instance = new DBManager();
|
if (m_Instance == null)
|
||||||
|
{
|
||||||
|
m_Instance = new DBManager();
|
||||||
|
}
|
||||||
|
|
||||||
return m_Instance;
|
return m_Instance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,7 +63,10 @@ namespace Inotify.Data
|
|||||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
||||||
{
|
{
|
||||||
Inotify_Data = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath);
|
Inotify_Data = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath);
|
||||||
if (!Directory.Exists(Inotify_Data)) Directory.CreateDirectory(Inotify_Data);
|
if (!Directory.Exists(Inotify_Data))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(Inotify_Data);
|
||||||
|
}
|
||||||
|
|
||||||
m_jwtPath = Path.Combine(Directory.GetCurrentDirectory(), "/" + m_dataPath + "/jwt.json");
|
m_jwtPath = Path.Combine(Directory.GetCurrentDirectory(), "/" + m_dataPath + "/jwt.json");
|
||||||
m_dbPath = Path.Combine(Directory.GetCurrentDirectory(), "/" + m_dataPath + "/data.db");
|
m_dbPath = Path.Combine(Directory.GetCurrentDirectory(), "/" + m_dataPath + "/data.db");
|
||||||
@ -74,7 +76,10 @@ namespace Inotify.Data
|
|||||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||||
{
|
{
|
||||||
Inotify_Data = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath);
|
Inotify_Data = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath);
|
||||||
if (!Directory.Exists(Inotify_Data)) Directory.CreateDirectory(Inotify_Data);
|
if (!Directory.Exists(Inotify_Data))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(Inotify_Data);
|
||||||
|
}
|
||||||
|
|
||||||
m_jwtPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath + "/jwt.json");
|
m_jwtPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath + "/jwt.json");
|
||||||
m_dbPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath + "/data.db");
|
m_dbPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath + "/data.db");
|
||||||
@ -107,20 +112,24 @@ namespace Inotify.Data
|
|||||||
m_dbConnection = new SqliteConnection(string.Format("Data Source={0}", m_dbPath));
|
m_dbConnection = new SqliteConnection(string.Format("Data Source={0}", m_dbPath));
|
||||||
|
|
||||||
if (m_dbConnection.State == ConnectionState.Closed)
|
if (m_dbConnection.State == ConnectionState.Closed)
|
||||||
|
{
|
||||||
m_dbConnection.Open();
|
m_dbConnection.Open();
|
||||||
|
}
|
||||||
|
|
||||||
DBase = new Database(m_dbConnection, DatabaseType.SQLite);
|
DBase = new Database(m_dbConnection, DatabaseType.SQLite)
|
||||||
DBase.KeepConnectionAlive = true;
|
{
|
||||||
|
KeepConnectionAlive = true
|
||||||
|
};
|
||||||
m_migrator = new Migrator(DBase);
|
m_migrator = new Migrator(DBase);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsToken(string token,out bool hasActive)
|
public bool IsToken(string token, out bool hasActive)
|
||||||
{
|
{
|
||||||
hasActive = false;
|
hasActive = false;
|
||||||
var userInfo= DBase.Query<SendUserInfo>().FirstOrDefault(e => e.Token == token);
|
var userInfo = DBase.Query<SendUserInfo>().FirstOrDefault(e => e.Token == token);
|
||||||
if (userInfo != null)
|
if (userInfo != null)
|
||||||
{
|
{
|
||||||
hasActive= DBase.Query<SendAuthInfo>().Any(e => e.UserId== userInfo.Id && e.Active);
|
hasActive = DBase.Query<SendAuthInfo>().Any(e => e.UserId == userInfo.Id && e.Active);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,11 +163,16 @@ namespace Inotify.Data
|
|||||||
guid = string.Empty;
|
guid = string.Empty;
|
||||||
var upToekn = token.ToUpper();
|
var upToekn = token.ToUpper();
|
||||||
var userInfo = DBManager.Instance.DBase.Query<SendUserInfo>().FirstOrDefault(e => e.Token == upToekn && e.Active);
|
var userInfo = DBManager.Instance.DBase.Query<SendUserInfo>().FirstOrDefault(e => e.Token == upToekn && e.Active);
|
||||||
if (userInfo == null) return null;
|
if (userInfo == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
var authInfo = DBManager.Instance.DBase.Query<SendAuthInfo>().FirstOrDefault(e => e.Id == userInfo.SendAuthId && e.UserId == userInfo.Id);
|
var authInfo = DBManager.Instance.DBase.Query<SendAuthInfo>().FirstOrDefault(e => e.Id == userInfo.SendAuthId && e.UserId == userInfo.Id);
|
||||||
if (authInfo == null)
|
if (authInfo == null)
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
guid = authInfo.SendMethodTemplate;
|
guid = authInfo.SendMethodTemplate;
|
||||||
return authInfo.AuthData;
|
return authInfo.AuthData;
|
||||||
@ -177,7 +191,7 @@ namespace Inotify.Data
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sendAuthInfos = DBManager.Instance.DBase.Query<SendAuthInfo>().Where(e => e.UserId == userInfo.Id && e.Active &&e.Key==key).ToArray();
|
sendAuthInfos = DBManager.Instance.DBase.Query<SendAuthInfo>().Where(e => e.UserId == userInfo.Id && e.Active && e.Key == key).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
using Inotify.Data.Models;
|
using Inotify.Data.Models;
|
||||||
using NPoco.Migrations;
|
using NPoco.Migrations;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Data
|
namespace Inotify.Data
|
||||||
{
|
{
|
||||||
@ -31,7 +28,9 @@ namespace Inotify.Data
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!Migrator.TableExists<SendInfo>())
|
if (!Migrator.TableExists<SendInfo>())
|
||||||
|
{
|
||||||
Migrator.CreateTable<SendInfo>(true).Execute();
|
Migrator.CreateTable<SendInfo>(true).Execute();
|
||||||
|
}
|
||||||
|
|
||||||
if (!Migrator.TableExists<SendUserInfo>())
|
if (!Migrator.TableExists<SendUserInfo>())
|
||||||
{
|
{
|
||||||
@ -80,7 +79,7 @@ namespace Inotify.Data
|
|||||||
{
|
{
|
||||||
protected override void execute()
|
protected override void execute()
|
||||||
{
|
{
|
||||||
|
|
||||||
//对AuthInfo的AuthDate字段进行加密
|
//对AuthInfo的AuthDate字段进行加密
|
||||||
var sendAuthInfos = Migrator.Database.Query<SendAuthInfo>().ToList();
|
var sendAuthInfos = Migrator.Database.Query<SendAuthInfo>().ToList();
|
||||||
sendAuthInfos.ForEach(sendAuthInfo =>
|
sendAuthInfos.ForEach(sendAuthInfo =>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using System;
|
using Inotify.Common;
|
||||||
using Inotify.Common;
|
using System;
|
||||||
namespace Inotify.Data.Models
|
namespace Inotify.Data.Models
|
||||||
{
|
{
|
||||||
[NPoco.TableName("sendAuthInfo")]
|
[NPoco.TableName("sendAuthInfo")]
|
||||||
@ -24,14 +24,8 @@ namespace Inotify.Data.Models
|
|||||||
[NPoco.Ignore]
|
[NPoco.Ignore]
|
||||||
public string AuthData
|
public string AuthData
|
||||||
{
|
{
|
||||||
get
|
get => AuthDataSave.Base64Decode();
|
||||||
{
|
set => AuthDataSave = value.Base64Encode();
|
||||||
return AuthDataSave.Base64Decode();
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
AuthDataSave = value.Base64Encode();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[NPoco.Column("modifyTime")]
|
[NPoco.Column("modifyTime")]
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
using System;
|
namespace Inotify.Data.Models
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Data.Models
|
|
||||||
{
|
{
|
||||||
[NPoco.TableName("sendInfo")]
|
[NPoco.TableName("sendInfo")]
|
||||||
[NPoco.PrimaryKey(new string[] { "templateID", "date" }, AutoIncrement = false)]
|
[NPoco.PrimaryKey(new string[] { "templateID", "date" }, AutoIncrement = false)]
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
using System;
|
namespace Inotify.Data.Models
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Data.Models
|
|
||||||
{
|
{
|
||||||
[NPoco.TableName("userInfo")]
|
[NPoco.TableName("userInfo")]
|
||||||
[NPoco.PrimaryKey("id")]
|
[NPoco.PrimaryKey("id")]
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
using System;
|
namespace Inotify.Data.Models.System
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Data.Models.System
|
|
||||||
{
|
{
|
||||||
public class JwtInfo
|
public class JwtInfo
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
using System;
|
namespace Inotify.Data.Models
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Data.Models
|
|
||||||
{
|
{
|
||||||
|
|
||||||
[NPoco.TableName("systemInfo")]
|
[NPoco.TableName("systemInfo")]
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||||
<StartupObject>Inotify.Program</StartupObject>
|
<StartupObject>Inotify.Program</StartupObject>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<AssemblyVersion>2.0.0.1</AssemblyVersion>
|
<AssemblyVersion>2.0.0.2</AssemblyVersion>
|
||||||
<FileVersion>2.0.0.1</FileVersion>
|
<FileVersion>2.0.0.2</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
@ -1,16 +1,7 @@
|
|||||||
using Inotify.Data;
|
using Inotify.Data;
|
||||||
using Inotify.Sends;
|
using Inotify.Sends;
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.Hosting;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify
|
namespace Inotify
|
||||||
{
|
{
|
||||||
|
@ -1,19 +1,10 @@
|
|||||||
using Inotify.Common;
|
using Newtonsoft.Json.Linq;
|
||||||
using Inotify.Data;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Security.Policy;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Sends.Products
|
namespace Inotify.Sends.Products
|
||||||
{
|
{
|
||||||
@ -41,7 +32,7 @@ namespace Inotify.Sends.Products
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[SendMethodKey("3B6DE04D-A9EF-4C91-A151-60B7425C5AB2", "Bark", Order = 6, Waring = "BARK通道勿手动添加,请使用APP添加BARK地址绑定")]
|
[SendMethodKey("3B6DE04D-A9EF-4C91-A151-60B7425C5AB2", "Bark", Order = 2999, Waring = "BARK通道勿手动添加,请使用APP添加BARK地址绑定")]
|
||||||
public class BarkSendTemplate : SendTemplate<BarkAuth>
|
public class BarkSendTemplate : SendTemplate<BarkAuth>
|
||||||
{
|
{
|
||||||
private static string KeyID;
|
private static string KeyID;
|
||||||
@ -50,8 +41,6 @@ namespace Inotify.Sends.Products
|
|||||||
|
|
||||||
private static CngKey SecretKey;
|
private static CngKey SecretKey;
|
||||||
|
|
||||||
public override BarkAuth Auth { get; set; }
|
|
||||||
|
|
||||||
public override bool SendMessage(SendMessage message)
|
public override bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
if (SecretKey == null)
|
if (SecretKey == null)
|
||||||
@ -65,7 +54,9 @@ namespace Inotify.Sends.Products
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Auth.DeviceToken == null)
|
if (Auth.DeviceToken == null)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var payload = CreatePayload(message);
|
var payload = CreatePayload(message);
|
||||||
var accessToken = CreateAccessToken(payload);
|
var accessToken = CreateAccessToken(payload);
|
||||||
@ -82,9 +73,14 @@ namespace Inotify.Sends.Products
|
|||||||
|
|
||||||
var alert = new Dictionary<string, object>();
|
var alert = new Dictionary<string, object>();
|
||||||
if (!string.IsNullOrEmpty(message.Data))
|
if (!string.IsNullOrEmpty(message.Data))
|
||||||
|
{
|
||||||
alert.Add("body", message.Data);
|
alert.Add("body", message.Data);
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(message.Title))
|
if (!string.IsNullOrEmpty(message.Title))
|
||||||
|
{
|
||||||
alert.Add("title", message.Title);
|
alert.Add("title", message.Title);
|
||||||
|
}
|
||||||
|
|
||||||
var aps = new Dictionary<string, object>
|
var aps = new Dictionary<string, object>
|
||||||
{
|
{
|
||||||
@ -105,7 +101,9 @@ namespace Inotify.Sends.Products
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(message.Title))
|
if (!string.IsNullOrEmpty(message.Title))
|
||||||
|
{
|
||||||
payload.Add("copy", message.Title);
|
payload.Add("copy", message.Title);
|
||||||
|
}
|
||||||
|
|
||||||
var payloadString = JObject.FromObject(payload).ToString();
|
var payloadString = JObject.FromObject(payload).ToString();
|
||||||
|
|
||||||
@ -164,7 +162,9 @@ namespace Inotify.Sends.Products
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
88
Inotify/Sends/Products/DingtalkSendTemplate.cs
Normal file
88
Inotify/Sends/Products/DingtalkSendTemplate.cs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
using Inotify.Common;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
using System.Web;
|
||||||
|
|
||||||
|
namespace Inotify.Sends.Products
|
||||||
|
{
|
||||||
|
|
||||||
|
public class DingtalkAuth
|
||||||
|
{
|
||||||
|
[InputTypeAttribte(0, "WebHook", "WebHook", "https://oapi.dingtalk.com/robot/send?access_token=xxxxx")]
|
||||||
|
public string WebHook { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
[InputTypeAttribte(0, "Secret", "签名校验", "SEC77xxxx")]
|
||||||
|
public string Secret { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[SendMethodKey("048297D4-D975-48F6-9A91-8B4EF75805C1", "钉钉群机器人", Order = 21)]
|
||||||
|
public class DingtalkSendTemplate : SendTemplate<DingtalkAuth>
|
||||||
|
{
|
||||||
|
public override bool SendMessage(SendMessage message)
|
||||||
|
{
|
||||||
|
var bodyObject = new
|
||||||
|
{
|
||||||
|
markdown = new
|
||||||
|
{
|
||||||
|
title = $"{message.Title}",
|
||||||
|
text = $"#### {message.Title}\n{message.Data}",
|
||||||
|
},
|
||||||
|
msgtype = "markdown",
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
var timestamp = DateTime.UtcNow.ToUTC();
|
||||||
|
var sign = GetHmac(timestamp, Auth.Secret);
|
||||||
|
var url = $"{Auth.WebHook}×tamp={timestamp}&sign={sign}";
|
||||||
|
var webRequest = WebRequest.Create(url);
|
||||||
|
|
||||||
|
var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(bodyObject));
|
||||||
|
|
||||||
|
webRequest.Method = "POST";
|
||||||
|
webRequest.ContentType = "application/json;charset=utf-8";
|
||||||
|
webRequest.ContentLength = 0;
|
||||||
|
|
||||||
|
using (var postStream = webRequest.GetRequestStream())
|
||||||
|
{
|
||||||
|
var requestStream = webRequest.GetRequestStream();
|
||||||
|
webRequest.ContentLength = bytes.Length;
|
||||||
|
requestStream.Write(bytes, 0, bytes.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = webRequest.GetResponse();
|
||||||
|
using (Stream stream = response.GetResponseStream())
|
||||||
|
{
|
||||||
|
using StreamReader reader = new StreamReader(stream, Encoding.UTF8);
|
||||||
|
var resuleJson = reader.ReadToEnd();
|
||||||
|
if (resuleJson.Contains("errcode"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private string GetHmac(long timestamp, string secret)
|
||||||
|
{
|
||||||
|
var stringToSign = $"{timestamp}\n{secret}";
|
||||||
|
using var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
|
||||||
|
byte[] hashmessage = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
|
||||||
|
return HttpUtility.UrlEncode(Convert.ToBase64String(hashmessage), Encoding.UTF8);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,7 @@
|
|||||||
using FluentEmail.Core;
|
using FluentEmail.Core;
|
||||||
using FluentEmail.Liquid;
|
|
||||||
using FluentEmail.Smtp;
|
using FluentEmail.Smtp;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Mail;
|
using System.Net.Mail;
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Inotify.Sends.Products
|
namespace Inotify.Sends.Products
|
||||||
{
|
{
|
||||||
@ -38,8 +34,6 @@ namespace Inotify.Sends.Products
|
|||||||
[SendMethodKey("EA2B43F7-956C-4C01-B583-0C943ABB36C3", "邮件推送", Order = 1)]
|
[SendMethodKey("EA2B43F7-956C-4C01-B583-0C943ABB36C3", "邮件推送", Order = 1)]
|
||||||
public class EmailSendTemplate : SendTemplate<EmailAuth>
|
public class EmailSendTemplate : SendTemplate<EmailAuth>
|
||||||
{
|
{
|
||||||
public override EmailAuth Auth { get; set; }
|
|
||||||
|
|
||||||
public override bool SendMessage(SendMessage message)
|
public override bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
var smtpSender = new SmtpSender(new SmtpClient()
|
var smtpSender = new SmtpSender(new SmtpClient()
|
||||||
@ -52,8 +46,7 @@ namespace Inotify.Sends.Products
|
|||||||
Credentials = new NetworkCredential(Auth.From, Auth.Password),
|
Credentials = new NetworkCredential(Auth.From, Auth.Password),
|
||||||
});
|
});
|
||||||
|
|
||||||
var email =
|
var email = Email.From(Auth.From, Auth.FromName)
|
||||||
Email.From(Auth.From, Auth.FromName)
|
|
||||||
.Subject(message.Title)
|
.Subject(message.Title)
|
||||||
.Body(message.Data ?? "")
|
.Body(message.Data ?? "")
|
||||||
.To(Auth.To);
|
.To(Auth.To);
|
||||||
|
96
Inotify/Sends/Products/FeishuSendTemplate.cs
Normal file
96
Inotify/Sends/Products/FeishuSendTemplate.cs
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
using Inotify.Common;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Inotify.Sends.Products
|
||||||
|
{
|
||||||
|
public class FeishuAuth
|
||||||
|
{
|
||||||
|
[InputTypeAttribte(0, "WebHook", "WebHook", "https://open.feishu.cn/open-apis/bot/v2/hook/5d7b917e-bfb8-4c7e-ba8c-337xxxx")]
|
||||||
|
public string WebHook { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
[InputTypeAttribte(0, "Secret", "签名校验", "VcgAbeuZOhTZPSP0zxxxx")]
|
||||||
|
public string Secret { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[SendMethodKey("C01A08B4-3A71-452B-9D4B-D8EC7EF1D68F", "飞书群机器人", Order = 22)]
|
||||||
|
public class FeishuASendTemplate : SendTemplate<FeishuAuth>
|
||||||
|
{
|
||||||
|
public override bool SendMessage(SendMessage message)
|
||||||
|
{
|
||||||
|
var timestamp = DateTime.Now.ToUnix() - 10;
|
||||||
|
var sign = GetHmac(timestamp, Auth.Secret);
|
||||||
|
|
||||||
|
var bodyObject = new
|
||||||
|
{
|
||||||
|
content = new
|
||||||
|
{
|
||||||
|
text = $"{message.Title}\n{message.Data}",
|
||||||
|
},
|
||||||
|
msg_type = "text",
|
||||||
|
sign = sign,
|
||||||
|
timestamp = timestamp,
|
||||||
|
};
|
||||||
|
Console.WriteLine(bodyObject);
|
||||||
|
|
||||||
|
var webRequest = WebRequest.Create(Auth.WebHook);
|
||||||
|
var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(bodyObject));
|
||||||
|
|
||||||
|
webRequest.Method = "POST";
|
||||||
|
webRequest.ContentType = "application/json";
|
||||||
|
webRequest.ContentLength = 0;
|
||||||
|
|
||||||
|
using (var postStream = webRequest.GetRequestStream())
|
||||||
|
{
|
||||||
|
var requestStream = webRequest.GetRequestStream();
|
||||||
|
webRequest.ContentLength = bytes.Length;
|
||||||
|
requestStream.Write(bytes, 0, bytes.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = webRequest.GetResponse();
|
||||||
|
using (Stream stream = response.GetResponseStream())
|
||||||
|
{
|
||||||
|
using StreamReader reader = new StreamReader(stream, Encoding.UTF8);
|
||||||
|
var resuleJson = reader.ReadToEnd();
|
||||||
|
if (resuleJson.Contains("code"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetHmac(long timestamp, string secret)
|
||||||
|
{
|
||||||
|
var stringToSign = $"{timestamp}\n{secret}";
|
||||||
|
using var hmacsha256 = new HMACSHA256Final(Encoding.UTF8.GetBytes(stringToSign));
|
||||||
|
return Convert.ToBase64String(hmacsha256.GetHashFinal());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class HMACSHA256Final : HMACSHA256
|
||||||
|
{
|
||||||
|
public HMACSHA256Final(byte[] bytes) : base(bytes)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public byte[] GetHashFinal()
|
||||||
|
{
|
||||||
|
|
||||||
|
return base.HashFinal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +1,4 @@
|
|||||||
using System;
|
using System.Net;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Sends.Products
|
namespace Inotify.Sends.Products
|
||||||
{
|
{
|
||||||
@ -16,7 +12,6 @@ namespace Inotify.Sends.Products
|
|||||||
[SendMethodKey("ADB11045-F2C8-457E-BF7E-1698AD37ED53", "自定义GET", Order = 4)]
|
[SendMethodKey("ADB11045-F2C8-457E-BF7E-1698AD37ED53", "自定义GET", Order = 4)]
|
||||||
public class HttpGetTemplate : SendTemplate<HttpGetAuth>
|
public class HttpGetTemplate : SendTemplate<HttpGetAuth>
|
||||||
{
|
{
|
||||||
public override HttpGetAuth Auth { get; set; }
|
|
||||||
|
|
||||||
public override bool SendMessage(SendMessage message)
|
public override bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
|
@ -1,10 +1,5 @@
|
|||||||
using System;
|
using System.Net;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify.Sends.Products
|
namespace Inotify.Sends.Products
|
||||||
{
|
{
|
||||||
@ -29,19 +24,23 @@ namespace Inotify.Sends.Products
|
|||||||
[SendMethodKey("A3C1E614-717E-4CF1-BA9B-7242717FC037", "自定义POST", Order = 5)]
|
[SendMethodKey("A3C1E614-717E-4CF1-BA9B-7242717FC037", "自定义POST", Order = 5)]
|
||||||
public class HttpPostTemplate : SendTemplate<HttpPostAuth>
|
public class HttpPostTemplate : SendTemplate<HttpPostAuth>
|
||||||
{
|
{
|
||||||
public override HttpPostAuth Auth { get; set; }
|
|
||||||
|
|
||||||
public override bool SendMessage(SendMessage message)
|
public override bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
if (Auth.Data == null)
|
if (Auth.Data == null)
|
||||||
|
{
|
||||||
Auth.Data = "";
|
Auth.Data = "";
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(Auth.ContentType))
|
if (string.IsNullOrEmpty(Auth.ContentType))
|
||||||
|
{
|
||||||
Auth.ContentType = "application/json";
|
Auth.ContentType = "application/json";
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(Auth.Encoding))
|
if (string.IsNullOrEmpty(Auth.Encoding))
|
||||||
|
{
|
||||||
Auth.Encoding = "utf-8";
|
Auth.Encoding = "utf-8";
|
||||||
|
}
|
||||||
|
|
||||||
var url = Auth.URL.Replace("{title}", message.Title).Replace("{data}", message.Data);
|
var url = Auth.URL.Replace("{title}", message.Title).Replace("{data}", message.Data);
|
||||||
var webRequest = WebRequest.Create(url);
|
var webRequest = WebRequest.Create(url);
|
||||||
|
@ -1,10 +1,5 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Telegram.Bot;
|
using Telegram.Bot;
|
||||||
using Telegram.Bot.Types.InputFiles;
|
using Telegram.Bot.Types.InputFiles;
|
||||||
|
|
||||||
@ -26,7 +21,6 @@ namespace Inotify.Sends.Products
|
|||||||
public class TelegramBotSendTemplate : SendTemplate<TelegramBotAuth>
|
public class TelegramBotSendTemplate : SendTemplate<TelegramBotAuth>
|
||||||
{
|
{
|
||||||
|
|
||||||
public override TelegramBotAuth Auth { get; set; }
|
|
||||||
|
|
||||||
public override bool SendMessage(SendMessage message)
|
public override bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
@ -34,7 +28,7 @@ namespace Inotify.Sends.Products
|
|||||||
var proxy = GetProxy();
|
var proxy = GetProxy();
|
||||||
var client = proxy == null ? new TelegramBotClient(Auth.BotToken) : new TelegramBotClient(Auth.BotToken, proxy);
|
var client = proxy == null ? new TelegramBotClient(Auth.BotToken) : new TelegramBotClient(Auth.BotToken, proxy);
|
||||||
var content = string.IsNullOrEmpty(message.Title) ? message.Title : message.Title + "\n" + message.Data;
|
var content = string.IsNullOrEmpty(message.Title) ? message.Title : message.Title + "\n" + message.Data;
|
||||||
var isIMG = !String.IsNullOrEmpty(message.Title) && IsUrl(message.Title) && IsImage(message.Title) && String.IsNullOrEmpty(message.Data);
|
var isIMG = !string.IsNullOrEmpty(message.Title) && IsUrl(message.Title) && IsImage(message.Title) && string.IsNullOrEmpty(message.Data);
|
||||||
if (isIMG)
|
if (isIMG)
|
||||||
{
|
{
|
||||||
client.SendPhotoAsync(Auth.Chat_id, new InputOnlineFile(new Uri(message.Title)));
|
client.SendPhotoAsync(Auth.Chat_id, new InputOnlineFile(new Uri(message.Title)));
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
using Inotify.Common;
|
using Newtonsoft.Json;
|
||||||
using Inotify.Sends;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@ -30,64 +27,34 @@ namespace Inotify.Sends.Products
|
|||||||
[SendMethodKey("409A30D5-ABE8-4A28-BADD-D04B9908D763", "企业微信", Order = 0)]
|
[SendMethodKey("409A30D5-ABE8-4A28-BADD-D04B9908D763", "企业微信", Order = 0)]
|
||||||
public class WeixiSendTemplate : SendTemplate<WeixiAuth>
|
public class WeixiSendTemplate : SendTemplate<WeixiAuth>
|
||||||
{
|
{
|
||||||
public override WeixiAuth Auth { get; set; }
|
|
||||||
|
|
||||||
public override bool SendMessage(SendMessage message)
|
public override bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
if (Auth == null) return false;
|
if (Auth == null)
|
||||||
|
|
||||||
var token = GetAccessToken();
|
|
||||||
if (token == null) return false;
|
|
||||||
|
|
||||||
return PostMail(token, message.Title, message.Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 获取AccessToken
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
private string GetAccessToken()
|
|
||||||
{
|
|
||||||
var key = Auth.Corpid + Auth.AgentID + Auth.Corpsecret;
|
|
||||||
var toekn = SendCacheStore.Get(key);
|
|
||||||
if (toekn == null)
|
|
||||||
{
|
{
|
||||||
var url = string.Format(@"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", Auth.Corpid, Auth.Corpsecret);
|
return false;
|
||||||
|
|
||||||
WebRequest request = WebRequest.Create(url);
|
|
||||||
request.Credentials = CredentialCache.DefaultCredentials;
|
|
||||||
using WebResponse response = request.GetResponse();
|
|
||||||
using Stream streamResponse = response.GetResponseStream();
|
|
||||||
StreamReader reader = new StreamReader(streamResponse);
|
|
||||||
string responseFromServer = reader.ReadToEnd();
|
|
||||||
if (!string.IsNullOrEmpty(responseFromServer))
|
|
||||||
{
|
|
||||||
if (JsonConvert.DeserializeObject(responseFromServer) is JObject res)
|
|
||||||
{
|
|
||||||
if (res.TryGetValue("access_token", out JToken? jtoken))
|
|
||||||
{
|
|
||||||
toekn = jtoken.ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reader.Close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toekn != null)
|
var token = CreateAcessToken();
|
||||||
SendCacheStore.Set(key, toekn, DateTimeOffset.Now.AddHours(2));
|
if (token == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return toekn;
|
return CreatePush(token, message.Title, message.Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool PostMail(string accessToken, string title, string? data)
|
private bool CreatePush(string accessToken, string title, string? data)
|
||||||
{
|
{
|
||||||
var uri = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
|
var uri = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
|
||||||
|
|
||||||
var content = string.IsNullOrEmpty(data) ? title : title + "\n" + data;
|
var content = string.IsNullOrEmpty(data) ? title : title + "\n" + data;
|
||||||
var isImage = !String.IsNullOrEmpty(title) && IsUrl(title) && IsImage(title) && String.IsNullOrEmpty(data);
|
var isImage = !string.IsNullOrEmpty(title) && IsUrl(title) && IsImage(title) && string.IsNullOrEmpty(data);
|
||||||
var imageData = isImage ? GetImage(title) : null;
|
var imageData = isImage ? GetImage(title) : null;
|
||||||
string mediaId = string.Empty;
|
string mediaId = string.Empty;
|
||||||
if (imageData != null)
|
if (imageData != null)
|
||||||
mediaId = UpLoadIMage(accessToken, imageData);
|
{
|
||||||
|
mediaId = CreateImage(accessToken, imageData);
|
||||||
|
}
|
||||||
|
|
||||||
//创建请求
|
//创建请求
|
||||||
WebRequest myWebRequest = WebRequest.Create(uri);
|
WebRequest myWebRequest = WebRequest.Create(uri);
|
||||||
@ -148,7 +115,42 @@ namespace Inotify.Sends.Products
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string UpLoadIMage(string accessToken, byte[] bytes)
|
private string CreateAcessToken()
|
||||||
|
{
|
||||||
|
var key = Auth.Corpid + Auth.AgentID + Auth.Corpsecret;
|
||||||
|
var toekn = SendCacheStore.Get(key);
|
||||||
|
if (toekn == null)
|
||||||
|
{
|
||||||
|
var url = string.Format(@"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}", Auth.Corpid, Auth.Corpsecret);
|
||||||
|
|
||||||
|
WebRequest request = WebRequest.Create(url);
|
||||||
|
request.Credentials = CredentialCache.DefaultCredentials;
|
||||||
|
using WebResponse response = request.GetResponse();
|
||||||
|
using Stream streamResponse = response.GetResponseStream();
|
||||||
|
StreamReader reader = new StreamReader(streamResponse);
|
||||||
|
string responseFromServer = reader.ReadToEnd();
|
||||||
|
if (!string.IsNullOrEmpty(responseFromServer))
|
||||||
|
{
|
||||||
|
if (JsonConvert.DeserializeObject(responseFromServer) is JObject res)
|
||||||
|
{
|
||||||
|
if (res.TryGetValue("access_token", out JToken? jtoken))
|
||||||
|
{
|
||||||
|
toekn = jtoken.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (toekn != null)
|
||||||
|
{
|
||||||
|
SendCacheStore.Set(key, toekn, DateTimeOffset.Now.AddHours(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
return toekn;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string CreateImage(string accessToken, byte[] bytes)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -182,7 +184,7 @@ namespace Inotify.Sends.Products
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -1,13 +1,9 @@
|
|||||||
using Inotify;
|
using Inotify.Data;
|
||||||
using Inotify.Data;
|
|
||||||
using Inotify.Data.Models;
|
using Inotify.Data.Models;
|
||||||
using Inotify.Sends;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.Caching;
|
using System.Runtime.Caching;
|
||||||
using System.Text;
|
|
||||||
using System.Web;
|
|
||||||
|
|
||||||
namespace Inotify.Sends
|
namespace Inotify.Sends
|
||||||
{
|
{
|
||||||
@ -27,7 +23,10 @@ namespace Inotify.Sends
|
|||||||
{
|
{
|
||||||
object obj = m_cache.Get(key);
|
object obj = m_cache.Get(key);
|
||||||
if (obj != null && obj is string)
|
if (obj != null && obj is string)
|
||||||
|
{
|
||||||
return obj as string;
|
return obj as string;
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -40,7 +39,10 @@ namespace Inotify.Sends
|
|||||||
public static string GetSystemValue(string key)
|
public static string GetSystemValue(string key)
|
||||||
{
|
{
|
||||||
if (m_systemInfos.ContainsKey(key))
|
if (m_systemInfos.ContainsKey(key))
|
||||||
|
{
|
||||||
return m_systemInfos[key];
|
return m_systemInfos[key];
|
||||||
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
using System;
|
namespace Inotify.Sends
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace Inotify.Sends
|
|
||||||
{
|
{
|
||||||
public class SendMessage
|
public class SendMessage
|
||||||
{
|
{
|
||||||
|
@ -1,15 +1,10 @@
|
|||||||
using Inotify;
|
using Inotify.Data;
|
||||||
using Inotify.Data;
|
|
||||||
using Inotify.Data.Models;
|
using Inotify.Data.Models;
|
||||||
using Inotify.Sends;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +17,11 @@ namespace Inotify.Sends
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (m_Instance == null) m_Instance = new SendTaskManager();
|
if (m_Instance == null)
|
||||||
|
{
|
||||||
|
m_Instance = new SendTaskManager();
|
||||||
|
}
|
||||||
|
|
||||||
return m_Instance;
|
return m_Instance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -47,7 +46,7 @@ namespace Inotify.Sends
|
|||||||
var sendMethodTemplates = Assembly.GetExecutingAssembly()
|
var sendMethodTemplates = Assembly.GetExecutingAssembly()
|
||||||
.GetTypes()
|
.GetTypes()
|
||||||
.Where(e => e.GetCustomAttribute<SendMethodKeyAttribute>() != null)
|
.Where(e => e.GetCustomAttribute<SendMethodKeyAttribute>() != null)
|
||||||
.OrderBy(e => e.GetCustomAttribute<SendMethodKeyAttribute>().Order)
|
.OrderBy(e => e.GetCustomAttribute<SendMethodKeyAttribute>().Order.ToString())
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
sendMethodTemplates.ForEach(sendMethodTemplate =>
|
sendMethodTemplates.ForEach(sendMethodTemplate =>
|
||||||
@ -105,7 +104,9 @@ namespace Inotify.Sends
|
|||||||
public bool SendMessage(SendMessage message)
|
public bool SendMessage(SendMessage message)
|
||||||
{
|
{
|
||||||
if (m_sendMessages.Count > 10000)
|
if (m_sendMessages.Count > 10000)
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
m_sendMessages.Add(message);
|
m_sendMessages.Add(message);
|
||||||
|
|
||||||
@ -124,7 +125,9 @@ namespace Inotify.Sends
|
|||||||
if (getTemeplateMethod != null)
|
if (getTemeplateMethod != null)
|
||||||
{
|
{
|
||||||
if (getTemeplateMethod.Invoke(obj, null) is InputTemeplate temeplate && temeplate.Key != null)
|
if (getTemeplateMethod.Invoke(obj, null) is InputTemeplate temeplate && temeplate.Key != null)
|
||||||
|
{
|
||||||
sendTemplates.Add(temeplate.Key, temeplate);
|
sendTemplates.Add(temeplate.Key, temeplate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sendTemplates;
|
return sendTemplates;
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
using Inotify.Sends;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Mail;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace Inotify.Sends
|
namespace Inotify.Sends
|
||||||
@ -86,8 +82,13 @@ namespace Inotify.Sends
|
|||||||
if (item.Name != null && item.Value != null)
|
if (item.Name != null && item.Value != null)
|
||||||
{
|
{
|
||||||
if (item.Type == InputType.CHECK)
|
if (item.Type == InputType.CHECK)
|
||||||
|
{
|
||||||
jObject.Add(item.Name, item.Value.ToLower() == "true");
|
jObject.Add(item.Name, item.Value.ToLower() == "true");
|
||||||
else jObject.Add(item.Name, item.Value);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
jObject.Add(item.Name, item.Value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,8 +126,8 @@ namespace Inotify.Sends
|
|||||||
{
|
{
|
||||||
public InputTypeValue InputTypeData { get; set; }
|
public InputTypeValue InputTypeData { get; set; }
|
||||||
|
|
||||||
|
|
||||||
private InputTypeAttribte(int order, string name, string description, string defaultValue, InputType type,bool show=true,bool readOnly=false)
|
private InputTypeAttribte(int order, string name, string description, string defaultValue, InputType type, bool show = true, bool readOnly = false)
|
||||||
{
|
{
|
||||||
InputTypeData = new InputTypeValue
|
InputTypeData = new InputTypeValue
|
||||||
{
|
{
|
||||||
@ -156,8 +157,7 @@ namespace Inotify.Sends
|
|||||||
|
|
||||||
public abstract class SendTemplate<T>
|
public abstract class SendTemplate<T>
|
||||||
{
|
{
|
||||||
|
public T Auth { get; set; }
|
||||||
public abstract T Auth { get; set; }
|
|
||||||
|
|
||||||
public void Composition(string authInfo)
|
public void Composition(string authInfo)
|
||||||
{
|
{
|
||||||
@ -173,7 +173,7 @@ namespace Inotify.Sends
|
|||||||
.Select(e => e.InputTypeData)
|
.Select(e => e.InputTypeData)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var sendMethodKeyAttribute = this.GetType().GetCustomAttribute<SendMethodKeyAttribute>();
|
var sendMethodKeyAttribute = GetType().GetCustomAttribute<SendMethodKeyAttribute>();
|
||||||
|
|
||||||
if (sendMethodKeyAttribute != null)
|
if (sendMethodKeyAttribute != null)
|
||||||
{
|
{
|
||||||
@ -190,10 +190,8 @@ namespace Inotify.Sends
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool SendMessage(SendMessage message)
|
public abstract bool SendMessage(SendMessage message);
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected WebProxy GetProxy()
|
protected WebProxy GetProxy()
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,6 @@ using Inotify.Controllers;
|
|||||||
using Inotify.Data;
|
using Inotify.Data;
|
||||||
using Inotify.Sends;
|
using Inotify.Sends;
|
||||||
using Inotify.ThridOauth;
|
using Inotify.ThridOauth;
|
||||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
@ -13,11 +12,7 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NPoco;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Net;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Encodings.Web;
|
using System.Text.Encodings.Web;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
@ -132,7 +127,7 @@ namespace Inotify
|
|||||||
rewriteContext.HttpContext.Request.Path = @"/api/send";
|
rewriteContext.HttpContext.Request.Path = @"/api/send";
|
||||||
rewriteContext.HttpContext.Request.QueryString = new QueryString($"?token={groups[1]}&key={groups[2]}");
|
rewriteContext.HttpContext.Request.QueryString = new QueryString($"?token={groups[1]}&key={groups[2]}");
|
||||||
}
|
}
|
||||||
else if(rewriteContext.HttpContext.Request.QueryString.Value.StartsWith("?"))
|
else if (rewriteContext.HttpContext.Request.QueryString.Value.StartsWith("?"))
|
||||||
{
|
{
|
||||||
rewriteContext.HttpContext.Request.Path = @"/info";
|
rewriteContext.HttpContext.Request.Path = @"/info";
|
||||||
rewriteContext.HttpContext.Request.QueryString = new QueryString();
|
rewriteContext.HttpContext.Request.QueryString = new QueryString();
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Inotify
|
namespace Inotify
|
||||||
{
|
{
|
||||||
@ -27,7 +23,9 @@ namespace Inotify
|
|||||||
public static StartUpManager Load()
|
public static StartUpManager Load()
|
||||||
{
|
{
|
||||||
if (_appManager == null)
|
if (_appManager == null)
|
||||||
|
{
|
||||||
_appManager = new StartUpManager();
|
_appManager = new StartUpManager();
|
||||||
|
}
|
||||||
|
|
||||||
return _appManager;
|
return _appManager;
|
||||||
}
|
}
|
||||||
@ -35,10 +33,14 @@ namespace Inotify
|
|||||||
public void Start(string[] args)
|
public void Start(string[] args)
|
||||||
{
|
{
|
||||||
if (_running)
|
if (_running)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_tokenSource != null && _tokenSource.IsCancellationRequested)
|
if (_tokenSource != null && _tokenSource.IsCancellationRequested)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_tokenSource = new CancellationTokenSource();
|
_tokenSource = new CancellationTokenSource();
|
||||||
_tokenSource.Token.ThrowIfCancellationRequested();
|
_tokenSource.Token.ThrowIfCancellationRequested();
|
||||||
@ -56,7 +58,9 @@ namespace Inotify
|
|||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
if (!_running)
|
if (!_running)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_tokenSource.Cancel();
|
_tokenSource.Cancel();
|
||||||
_running = false;
|
_running = false;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Newtonsoft.Json.Linq;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
using Inotify.ThridOauth.Entity;
|
namespace Inotify.ThridOauth.Entity
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.Entity
|
|
||||||
{
|
{
|
||||||
public class CredentialSetting
|
public class CredentialSetting
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Inotify.ThridOauth.Entity;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.Entity
|
namespace Inotify.ThridOauth.Entity
|
||||||
{
|
{
|
||||||
public class FaceBookCredential : CredentialSetting
|
public class FaceBookCredential : CredentialSetting
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Inotify.ThridOauth.Entity;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.Entity
|
namespace Inotify.ThridOauth.Entity
|
||||||
{
|
{
|
||||||
public class GitHubCredential : CredentialSetting
|
public class GitHubCredential : CredentialSetting
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Inotify.ThridOauth.Entity;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.Entity
|
namespace Inotify.ThridOauth.Entity
|
||||||
{
|
{
|
||||||
public class QQCredential : CredentialSetting
|
public class QQCredential : CredentialSetting
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Inotify.ThridOauth.Entity;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.Entity
|
namespace Inotify.ThridOauth.Entity
|
||||||
{
|
{
|
||||||
public class WechatCredential : CredentialSetting
|
public class WechatCredential : CredentialSetting
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Inotify.ThridOauth.Entity;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.Entity
|
namespace Inotify.ThridOauth.Entity
|
||||||
{
|
{
|
||||||
public class WeiBoCredential : CredentialSetting
|
public class WeiBoCredential : CredentialSetting
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
using Inotify.ThridOauth.IService;
|
namespace Inotify.ThridOauth.IService
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.IService
|
|
||||||
{
|
{
|
||||||
public interface IFacebookLogin : ILogin
|
public interface IFacebookLogin : ILogin
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
using Inotify.ThridOauth.IService;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.IService
|
namespace Inotify.ThridOauth.IService
|
||||||
{
|
{
|
||||||
public interface IGitHubLogin : ILogin
|
public interface IGitHubLogin : ILogin
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.IService;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
using Inotify.ThridOauth.IService;
|
namespace Inotify.ThridOauth.IService
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.IService
|
|
||||||
{
|
{
|
||||||
public interface IQqLogin : ILogin
|
public interface IQqLogin : ILogin
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
using Inotify.ThridOauth.IService;
|
namespace Inotify.ThridOauth.IService
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.IService
|
|
||||||
{
|
{
|
||||||
public interface ISinaLogin : ILogin
|
public interface ISinaLogin : ILogin
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
using Inotify.ThridOauth.IService;
|
namespace Inotify.ThridOauth.IService
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Inotify.ThridOauth.IService
|
|
||||||
{
|
{
|
||||||
public interface IWeChatLogin : ILogin
|
public interface IWeChatLogin : ILogin
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.Entity;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Inotify.ThridOauth.Service;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@ -47,7 +46,10 @@ namespace Inotify.ThridOauth.Service
|
|||||||
var token = GetAccessToken(code, ref errMsg);
|
var token = GetAccessToken(code, ref errMsg);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(errMsg))
|
if (!string.IsNullOrEmpty(errMsg))
|
||||||
|
{
|
||||||
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errMsg };
|
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errMsg };
|
||||||
|
}
|
||||||
|
|
||||||
var accessToken = token.Value<string>("access_token");
|
var accessToken = token.Value<string>("access_token");
|
||||||
|
|
||||||
var user = UserInfo(accessToken, ref errMsg);
|
var user = UserInfo(accessToken, ref errMsg);
|
||||||
|
@ -2,14 +2,10 @@ using Inotify.Sends;
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.Entity;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Inotify.ThridOauth.Service;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
|
||||||
|
|
||||||
@ -56,11 +52,14 @@ namespace Inotify.ThridOauth.Service
|
|||||||
var token = GetAccessToken(code, ref errorMsg);
|
var token = GetAccessToken(code, ref errorMsg);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(errorMsg))
|
if (!string.IsNullOrEmpty(errorMsg))
|
||||||
|
{
|
||||||
return new AuthorizeResult
|
return new AuthorizeResult
|
||||||
{
|
{
|
||||||
Code = Code.UserInfoErrorMsg,
|
Code = Code.UserInfoErrorMsg,
|
||||||
Error = errorMsg
|
Error = errorMsg
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
var accessToken = token.Value<string>("access_token");
|
var accessToken = token.Value<string>("access_token");
|
||||||
|
|
||||||
var user = UserInfo(accessToken, ref errorMsg);
|
var user = UserInfo(accessToken, ref errorMsg);
|
||||||
@ -140,11 +139,17 @@ namespace Inotify.ThridOauth.Service
|
|||||||
{
|
{
|
||||||
startindex = sourse.IndexOf(startstr, StringComparison.Ordinal);
|
startindex = sourse.IndexOf(startstr, StringComparison.Ordinal);
|
||||||
if (startindex == -1)
|
if (startindex == -1)
|
||||||
|
{
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
string tmpstr = sourse[(startindex + startstr.Length)..];
|
string tmpstr = sourse[(startindex + startstr.Length)..];
|
||||||
endindex = tmpstr.IndexOf(endstr, StringComparison.Ordinal);
|
endindex = tmpstr.IndexOf(endstr, StringComparison.Ordinal);
|
||||||
if (endindex == -1)
|
if (endindex == -1)
|
||||||
|
{
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
result = tmpstr.Remove(endindex);
|
result = tmpstr.Remove(endindex);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
using Inotify.Sends;
|
using Inotify.Sends;
|
||||||
using Inotify.ThridOauth.Entity;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.Service;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using System;
|
using System;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.Entity;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Inotify.ThridOauth.Service;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@ -58,7 +57,10 @@ namespace Inotify.ThridOauth.Service
|
|||||||
var token = GetAccessToken(code, ref errorMsg);
|
var token = GetAccessToken(code, ref errorMsg);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(errorMsg))
|
if (!string.IsNullOrEmpty(errorMsg))
|
||||||
|
{
|
||||||
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errorMsg };
|
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errorMsg };
|
||||||
|
}
|
||||||
|
|
||||||
var accessToken = token["access_token"];
|
var accessToken = token["access_token"];
|
||||||
|
|
||||||
var user = UserInfo(accessToken, ref errorMsg);
|
var user = UserInfo(accessToken, ref errorMsg);
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.Entity;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Inotify.ThridOauth.Service;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@ -55,7 +54,11 @@ namespace Inotify.ThridOauth.Service
|
|||||||
|
|
||||||
var token = GetAccessToken(code, ref errorMsg);
|
var token = GetAccessToken(code, ref errorMsg);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(errorMsg)) return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errorMsg };
|
if (!string.IsNullOrEmpty(errorMsg))
|
||||||
|
{
|
||||||
|
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errorMsg };
|
||||||
|
}
|
||||||
|
|
||||||
var accessToken = token.Value<string>("access_token");
|
var accessToken = token.Value<string>("access_token");
|
||||||
|
|
||||||
var uid = token.Value<string>("openid");
|
var uid = token.Value<string>("openid");
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
using Inotify.ThridOauth.Common;
|
using Inotify.ThridOauth.Common;
|
||||||
using Inotify.ThridOauth.Entity;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Inotify.ThridOauth.Service;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@ -53,7 +52,10 @@ namespace Inotify.ThridOauth.Service
|
|||||||
var token = GetAccessToken(code, ref errorMsg);
|
var token = GetAccessToken(code, ref errorMsg);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(errorMsg))
|
if (!string.IsNullOrEmpty(errorMsg))
|
||||||
|
{
|
||||||
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errorMsg };
|
return new AuthorizeResult { Code = Code.UserInfoErrorMsg, Error = errorMsg };
|
||||||
|
}
|
||||||
|
|
||||||
var accessToken = token.Value<string>("access_token");
|
var accessToken = token.Value<string>("access_token");
|
||||||
|
|
||||||
var uid = token.Value<string>("uid");
|
var uid = token.Value<string>("uid");
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using Inotify.ThridOauth;
|
using Inotify.ThridOauth.Entity;
|
||||||
using Inotify.ThridOauth.Entity;
|
|
||||||
using Inotify.ThridOauth.IService;
|
using Inotify.ThridOauth.IService;
|
||||||
using Inotify.ThridOauth.Service;
|
using Inotify.ThridOauth.Service;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
@ -16,7 +15,11 @@ namespace Inotify.ThridOauth
|
|||||||
public static IServiceCollection AddWeChatLogin(this IServiceCollection services,
|
public static IServiceCollection AddWeChatLogin(this IServiceCollection services,
|
||||||
Action<WechatCredential> credential)
|
Action<WechatCredential> credential)
|
||||||
{
|
{
|
||||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
if (services == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(services));
|
||||||
|
}
|
||||||
|
|
||||||
services.Configure(credential);
|
services.Configure(credential);
|
||||||
services.AddScoped<IWeChatLogin, WeChatLogin>();
|
services.AddScoped<IWeChatLogin, WeChatLogin>();
|
||||||
return services;
|
return services;
|
||||||
@ -25,7 +28,11 @@ namespace Inotify.ThridOauth
|
|||||||
public static IServiceCollection AddQqLogin(this IServiceCollection services,
|
public static IServiceCollection AddQqLogin(this IServiceCollection services,
|
||||||
Action<QQCredential> credential)
|
Action<QQCredential> credential)
|
||||||
{
|
{
|
||||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
if (services == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(services));
|
||||||
|
}
|
||||||
|
|
||||||
services.Configure(credential);
|
services.Configure(credential);
|
||||||
services.AddScoped<IQqLogin, QqLogin>();
|
services.AddScoped<IQqLogin, QqLogin>();
|
||||||
return services;
|
return services;
|
||||||
@ -34,7 +41,11 @@ namespace Inotify.ThridOauth
|
|||||||
public static IServiceCollection AddSinaLogin(this IServiceCollection services,
|
public static IServiceCollection AddSinaLogin(this IServiceCollection services,
|
||||||
Action<WeiBoCredential> credential)
|
Action<WeiBoCredential> credential)
|
||||||
{
|
{
|
||||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
if (services == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(services));
|
||||||
|
}
|
||||||
|
|
||||||
services.Configure(credential);
|
services.Configure(credential);
|
||||||
services.AddScoped<ISinaLogin, WeiBoLogin>();
|
services.AddScoped<ISinaLogin, WeiBoLogin>();
|
||||||
return services;
|
return services;
|
||||||
@ -43,7 +54,11 @@ namespace Inotify.ThridOauth
|
|||||||
public static IServiceCollection AddFackbookLogin(this IServiceCollection services,
|
public static IServiceCollection AddFackbookLogin(this IServiceCollection services,
|
||||||
Action<FaceBookCredential> credential)
|
Action<FaceBookCredential> credential)
|
||||||
{
|
{
|
||||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
if (services == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(services));
|
||||||
|
}
|
||||||
|
|
||||||
services.Configure(credential);
|
services.Configure(credential);
|
||||||
services.AddScoped<IFacebookLogin, FacebookLogin>();
|
services.AddScoped<IFacebookLogin, FacebookLogin>();
|
||||||
return services;
|
return services;
|
||||||
@ -52,7 +67,11 @@ namespace Inotify.ThridOauth
|
|||||||
public static IServiceCollection AddGitHubLogin(this IServiceCollection services,
|
public static IServiceCollection AddGitHubLogin(this IServiceCollection services,
|
||||||
Action<GitHubCredential> credential)
|
Action<GitHubCredential> credential)
|
||||||
{
|
{
|
||||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
if (services == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(services));
|
||||||
|
}
|
||||||
|
|
||||||
services.Configure(credential);
|
services.Configure(credential);
|
||||||
services.AddScoped<IGitHubLogin, GitHubLogin>();
|
services.AddScoped<IGitHubLogin, GitHubLogin>();
|
||||||
return services;
|
return services;
|
||||||
|
35
README.md
35
README.md
@ -23,8 +23,8 @@
|
|||||||
- [x] 电报机器人消息
|
- [x] 电报机器人消息
|
||||||
- [x] SMTP邮箱消息
|
- [x] SMTP邮箱消息
|
||||||
- [x] BARK
|
- [x] BARK
|
||||||
- [ ] 钉钉群机器人
|
- [x] 钉钉群机器人
|
||||||
- [ ] 飞书群机器人
|
- [x] 飞书群机器人
|
||||||
- [x] 自定义
|
- [x] 自定义
|
||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
@ -35,31 +35,34 @@
|
|||||||
* 支持自定义Get、POST
|
* 支持自定义Get、POST
|
||||||
* V2.0.0.2
|
* V2.0.0.2
|
||||||
* 支持BARK
|
* 支持BARK
|
||||||
|
* V2.0.0.3
|
||||||
|
* 支持钉钉群消息
|
||||||
|
* 支持飞书群消息
|
||||||
|
|
||||||
## 使用方法
|
## 使用方法
|
||||||
1. Docker安装
|
1. Docker安装
|
||||||
* 稳定版V1.0
|
* 稳定版V1.0
|
||||||
```
|
```
|
||||||
docker run --name=inotify -d -p 8000:80 -v inotify_data:/inotify_data --restart=always xpnas/inotify:latest
|
docker run --name=inotify -d -p 8000:80 -v inotify_data:/inotify_data --restart=always xpnas/inotify:latest
|
||||||
```
|
```
|
||||||
* 开发版V2.0.0.2
|
* 开发版V2.0.0.3
|
||||||
```
|
```
|
||||||
docker run --name=inotify -d -p 8000:80 -v inotify_data:/inotify_data --restart=always xpnas/inotify:master
|
docker run --name=inotify -d -p 8000:80 -v inotify_data:/inotify_data --restart=always xpnas/inotify:master
|
||||||
```
|
```
|
||||||
2. 配置Nginx代理
|
2. 配置Nginx代理
|
||||||
```
|
```
|
||||||
server
|
server
|
||||||
{
|
{
|
||||||
location / { proxy_pass http://127.0.0.1:8000; }
|
location / { proxy_pass http://127.0.0.1:8000; }
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. 进入`Github/Settings/Developer settings/OAuth Apps`创建应用
|
3. 进入`Github/Settings/Developer settings/OAuth Apps`创建应用
|
||||||
* 记录`Client ID`,创建`Client secrets`
|
* 记录`Client ID`,创建`Client secrets`
|
||||||
* `Authorization callback URL`回调地址填写https://{您的域名}/api/oauth/githubLogin
|
* `Authorization callback URL`回调地址填写https://{您的域名}/api/oauth/githubLogin
|
||||||
4. 使用`默认用户名admin,密码123456`登陆后台/全局参数,修改Github登陆的`应用ID`、`应用密钥`并启动登陆
|
4. 使用`默认用户名admin,密码123456`登陆后台/全局参数,修改Github登陆的`应用ID`、`应用密钥`并启动登陆
|
||||||
5. 建议将`管理权限`的用户名设置成自己的github用户名,再使用Github登陆后,在用户管理页面`删除默认账号admin`
|
5. 建议将`管理权限`的用户名设置成自己的github用户名,再使用Github登陆后,在用户管理页面`删除默认账号admin`
|
||||||
|
|
||||||
## BARK设置
|
## BARK设置
|
||||||
1. 本项目依据Bark-Server接口规范实现了内置BARK服务端
|
1. 本项目依据Bark-Server接口规范实现了内置BARK服务端
|
||||||
2. 复制或扫码`消息验证\BARK授权`中的地址,填入BARK应用的服务器地址中,如`https://inotify.cf?act=6D474C0DB1474F19BD8F7342D570C0FC`
|
2. 复制或扫码`消息验证\BARK授权`中的地址,填入BARK应用的服务器地址中,如`https://inotify.cf?act=6D474C0DB1474F19BD8F7342D570C0FC`
|
||||||
|
Loading…
Reference in New Issue
Block a user