Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release v14.3.0 #782

Merged
merged 50 commits into from
Feb 24, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
45d4496
remove "sort by" selection
EdiWang Jan 16, 2024
e47abeb
Merge pull request #775 from EdiWang/remove-sortby
EdiWang Jan 16, 2024
6845a50
bump version to 14.3.0-preview.1
EdiWang Jan 16, 2024
7e1cd29
remove IpRateLimiting, this should be managed by WAF
EdiWang Jan 17, 2024
ff1a881
rename type
EdiWang Jan 17, 2024
fb89492
rename type
EdiWang Jan 17, 2024
ba0ffc2
update cdn domain
EdiWang Jan 18, 2024
0130103
Update appsettings.json
EdiWang Jan 21, 2024
7b40e63
use enqueue api
EdiWang Jan 21, 2024
dbb4b9b
Merge pull request #776 from EdiWang/new-email-api
EdiWang Jan 21, 2024
b8a5f75
Update README.md
EdiWang Jan 21, 2024
2b94d0b
Update MoongladeEmailClient.cs
EdiWang Jan 21, 2024
39e1161
code refact
EdiWang Jan 21, 2024
c0fbd46
remove PagedListDisplayMode
EdiWang Jan 21, 2024
5b1432e
use lowercase for default db name
EdiWang Jan 21, 2024
e986cca
remove unused UAParser lib
EdiWang Jan 21, 2024
58bacec
code refact
EdiWang Jan 21, 2024
27122dd
Update CommentReplyNotification.cs
EdiWang Jan 21, 2024
e90f7f2
Update ContentProcessor.cs
EdiWang Jan 21, 2024
2ef67a3
Update README.md
EdiWang Jan 21, 2024
b257a99
Update README.md
EdiWang Jan 21, 2024
7101704
fix typo
EdiWang Jan 22, 2024
7c6567b
Update README.md
EdiWang Jan 22, 2024
1649518
Delete buildarm64.sh
EdiWang Jan 22, 2024
5d1c283
borrow code from https://github.com/shawnwildermuth/MetaWeblog like a…
EdiWang Jan 22, 2024
06c73e2
update c# style
EdiWang Jan 22, 2024
6c66425
change namespace like a Chinese "自主研发"
EdiWang Jan 22, 2024
e79d9fb
code refact
EdiWang Jan 22, 2024
c2d6efd
code refact
EdiWang Jan 22, 2024
b493fed
Merge pull request #777 from EdiWang/metaweblog-migration
EdiWang Jan 22, 2024
6841810
patch libs
EdiWang Jan 29, 2024
3e851ae
Create Program.zh-Hant.resx
EdiWang Feb 4, 2024
c98a57b
Update Moonglade.sln
EdiWang Feb 4, 2024
6e27f1a
Update Program.zh-Hant.resx
EdiWang Feb 4, 2024
3e2dd71
Update Program.zh-Hant.resx
EdiWang Feb 4, 2024
df5d468
Update Program.cs
EdiWang Feb 4, 2024
1e97025
Merge pull request #778 from EdiWang/zhhant
EdiWang Feb 4, 2024
1cd6ba5
Auto csproj fix and update by bot.
NugetNinja Feb 5, 2024
8f9bb53
Merge pull request #779 from NugetNinja/users/nugetninja/evergreen
EdiWang Feb 5, 2024
1ca19d5
upgrade actions
EdiWang Feb 10, 2024
5b4d682
Update azure-appservice-staging.yml
EdiWang Feb 10, 2024
b71e407
Delete azure-appservice-staging.yml
EdiWang Feb 10, 2024
5870abf
Update _MonacoLoaderScript.cshtml
EdiWang Feb 10, 2024
ef0e1b7
bump version
EdiWang Feb 10, 2024
6f9cc26
Auto csproj fix and update by bot.
NugetNinja Feb 12, 2024
6f54482
Merge pull request #780 from NugetNinja/users/nugetninja/evergreen
EdiWang Feb 12, 2024
3c1beb8
patch .NET
EdiWang Feb 15, 2024
5f4e8b6
Auto csproj fix and update by bot.
NugetNinja Feb 19, 2024
52e7b7d
Merge pull request #781 from NugetNinja/users/nugetninja/evergreen
EdiWang Feb 19, 2024
158dd42
bump version to 14.3.0.0
EdiWang Feb 24, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/Moonglade.MetaWeblog/DateTime8601.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using System.Globalization;
using System.Text.RegularExpressions;

namespace Moonglade.MetaWeblog;
// Borrowed from: https://github.com/snielsson/XmlRpcLight/blob/master/XmlRpcLight/DataTypes/DateTime8601.cs

internal static class DateTime8601
{
private static readonly Regex DateTime8601Regex = new(
@"(((?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2}))|((?<year>\d{4})(?<month>\d{2})(?<day>\d{2})))"
+ @"T"
+ @"(((?<hour>\d{2}):(?<minute>\d{2}):(?<second>\d{2}))|((?<hour>\d{2})(?<minute>\d{2})(?<second>\d{2})))"
+ @"(?<tz>$|Z|([+-]\d{2}:?(\d{2})?))");

public static bool TryParseDateTime8601(string date, out DateTime result)
{
result = DateTime.MinValue;
var m = DateTime8601Regex.Match(date);
var normalized = m.Groups["year"].Value + m.Groups["month"].Value + m.Groups["day"].Value
+ "T"
+ m.Groups["hour"].Value + m.Groups["minute"].Value + m.Groups["second"].Value
+ m.Groups["tz"].Value;
var formats = new[] {
"yyyyMMdd'T'HHmmss",
"yyyyMMdd'T'HHmmss'Z'",
"yyyyMMdd'T'HHmmsszzz",
"yyyyMMdd'T'HHmmsszz"
};

try
{
result = DateTime.ParseExact(normalized, formats, CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal);
return true;
}
catch (Exception)
{
return false;
}
}
}
34 changes: 34 additions & 0 deletions src/Moonglade.MetaWeblog/IMetaWeblogProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
namespace Moonglade.MetaWeblog;

public interface IMetaWeblogProvider
{
Task<UserInfo> GetUserInfoAsync(string key, string username, string password);

Task<BlogInfo[]> GetUsersBlogsAsync(string key, string username, string password);

Task<Post> GetPostAsync(string postid, string username, string password);

Task<Post[]> GetRecentPostsAsync(string blogid, string username, string password, int numberOfPosts);

Task<string> AddPostAsync(string blogid, string username, string password, Post post, bool publish);

Task<bool> DeletePostAsync(string key, string postid, string username, string password, bool publish);

Task<bool> EditPostAsync(string postid, string username, string password, Post post, bool publish);

Task<CategoryInfo[]> GetCategoriesAsync(string blogid, string username, string password);

Task<int> AddCategoryAsync(string key, string username, string password, NewCategory category);

Task<Tag[]> GetTagsAsync(string blogid, string username, string password);

Task<MediaObjectInfo> NewMediaObjectAsync(string blogid, string username, string password, MediaObject mediaObject);

Task<Page> GetPageAsync(string blogid, string pageid, string username, string password);
Task<Page[]> GetPagesAsync(string blogid, string username, string password, int numPages);
Task<Author[]> GetAuthorsAsync(string blogid, string username, string password);

Task<string> AddPageAsync(string blogid, string username, string password, Page page, bool publish);
Task<bool> EditPageAsync(string blogid, string pageid, string username, string password, Page page, bool publish);
Task<bool> DeletePageAsync(string blogid, string username, string password, string pageid);
}
6 changes: 6 additions & 0 deletions src/Moonglade.MetaWeblog/MetaWeblogException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Moonglade.MetaWeblog;

public class MetaWeblogException(string message, int code = 1) : Exception(message)
{
public int Code { get; private set; } = code;
}
19 changes: 19 additions & 0 deletions src/Moonglade.MetaWeblog/MetaWeblogExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace Moonglade.MetaWeblog;

public static class MetaWeblogExtensions
{
public static IApplicationBuilder UseMetaWeblog(this IApplicationBuilder builder, string path)
{
return builder.UseMiddleware<MetaWeblogMiddleware>(path);
}

public static IServiceCollection AddMetaWeblog<TImplementation>(this IServiceCollection coll) where TImplementation : class, IMetaWeblogProvider
{
return coll.AddScoped<IMetaWeblogProvider, TImplementation>()
.AddScoped<MetaWeblogService>();
}

}
36 changes: 36 additions & 0 deletions src/Moonglade.MetaWeblog/MetaWeblogMiddleware.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace Moonglade.MetaWeblog;

public class MetaWeblogMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, string urlEndpoint)
{
private readonly ILogger _logger = loggerFactory.CreateLogger<MetaWeblogMiddleware>();

public async Task Invoke(HttpContext context, MetaWeblogService service)
{
if (context.Request.Method == "POST" &&
context.Request.Path.StartsWithSegments(urlEndpoint) &&
context.Request.ContentType.ToLower().Contains("text/xml"))
{
try
{
context.Response.ContentType = "text/xml";
var rdr = new StreamReader(context.Request.Body);
var xml = await rdr.ReadToEndAsync();
_logger.LogInformation($"Request XMLRPC: {xml}");
var result = await service.InvokeAsync(xml);
_logger.LogInformation($"Result XMLRPC: {result}");
await context.Response.WriteAsync(result, Encoding.UTF8);
}
catch (Exception ex)
{
_logger.LogError($"Failed to read the content: {ex}");
}
return;
}

// Continue On
await next.Invoke(context);
}
}
126 changes: 126 additions & 0 deletions src/Moonglade.MetaWeblog/MetaWeblogService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
using Microsoft.Extensions.Logging;

namespace Moonglade.MetaWeblog;

public class MetaWeblogService(IMetaWeblogProvider provider, ILogger<MetaWeblogService> logger)
: XmlRpcService(logger)
{
[XmlRpcMethod("blogger.getUsersBlogs")]
public async Task<BlogInfo[]> GetUsersBlogsAsync(string key, string username, string password)
{
logger.LogInformation($"MetaWeblog:GetUserBlogs is called");
return await provider.GetUsersBlogsAsync(key, username, password);
}

[XmlRpcMethod("blogger.getUserInfo")]
public async Task<UserInfo> GetUserInfoAsync(string key, string username, string password)
{
logger.LogInformation($"MetaWeblog:GetUserInfo is called");
return await provider.GetUserInfoAsync(key, username, password);
}

[XmlRpcMethod("wp.newCategory")]
public async Task<int> AddCategoryAsync(string key, string username, string password, NewCategory category)
{
logger.LogInformation($"MetaWeblog:AddCategory is called");
return await provider.AddCategoryAsync(key, username, password, category);
}

[XmlRpcMethod("metaWeblog.getPost")]
public async Task<Post> GetPostAsync(string postid, string username, string password)
{
logger.LogInformation($"MetaWeblog:GetPost is called");
return await provider.GetPostAsync(postid, username, password);
}

[XmlRpcMethod("metaWeblog.getRecentPosts")]
public async Task<Post[]> GetRecentPostsAsync(string blogid, string username, string password, int numberOfPosts)
{
logger.LogInformation($"MetaWeblog:GetRecentPosts is called");
return await provider.GetRecentPostsAsync(blogid, username, password, numberOfPosts);
}

[XmlRpcMethod("metaWeblog.newPost")]
public async Task<string> AddPostAsync(string blogid, string username, string password, Post post, bool publish)
{
logger.LogInformation($"MetaWeblog:AddPost is called");
return await provider.AddPostAsync(blogid, username, password, post, publish);
}

[XmlRpcMethod("metaWeblog.editPost")]
public async Task<bool> EditPostAsync(string postid, string username, string password, Post post, bool publish)
{
logger.LogInformation($"MetaWeblog:EditPost is called");
return await provider.EditPostAsync(postid, username, password, post, publish);
}

[XmlRpcMethod("blogger.deletePost")]
public async Task<bool> DeletePostAsync(string key, string postid, string username, string password, bool publish)
{
logger.LogInformation($"MetaWeblog:DeletePost is called");
return await provider.DeletePostAsync(key, postid, username, password, publish);
}

[XmlRpcMethod("metaWeblog.getCategories")]
public async Task<CategoryInfo[]> GetCategoriesAsync(string blogid, string username, string password)
{
logger.LogInformation($"MetaWeblog:GetCategories is called");
return await provider.GetCategoriesAsync(blogid, username, password);
}

[XmlRpcMethod("wp.getTags")]
public async Task<Tag[]> GetTagsAsync(string blogid, string username, string password)
{
logger.LogInformation($"MetaWeblog:GetTagsAsync is called");
return await provider.GetTagsAsync(blogid, username, password);
}

[XmlRpcMethod("metaWeblog.newMediaObject")]
public async Task<MediaObjectInfo> NewMediaObjectAsync(string blogid, string username, string password, MediaObject mediaObject)
{
logger.LogInformation($"MetaWeblog:NewMediaObject is called");
return await provider.NewMediaObjectAsync(blogid, username, password, mediaObject);
}

[XmlRpcMethod("wp.getPage")]
public async Task<Page> GetPageAsync(string blogid, string pageid, string username, string password)
{
logger.LogInformation($"wp.getPage is called");
return await provider.GetPageAsync(blogid, pageid, username, password);
}

[XmlRpcMethod("wp.getPages")]
public async Task<Page[]> GetPagesAsync(string blogid, string username, string password, int numPages)
{
logger.LogInformation($"wp.getPages is called");
return await provider.GetPagesAsync(blogid, username, password, numPages);
}

[XmlRpcMethod("wp.getAuthors")]
public async Task<Author[]> GetAuthorsAsync(string blogid, string username, string password)
{
logger.LogInformation($"wp.getAuthors is called");
return await provider.GetAuthorsAsync(blogid, username, password);
}

[XmlRpcMethod("wp.newPage")]
public async Task<string> AddPageAsync(string blogid, string username, string password, Page page, bool publish)
{
logger.LogInformation($"wp.newPage is called");
return await provider.AddPageAsync(blogid, username, password, page, publish);
}

[XmlRpcMethod("wp.editPage")]
public async Task<bool> EditPageAsync(string blogid, string pageid, string username, string password, Page page, bool publish)
{
logger.LogInformation($"wp.editPage is called");
return await provider.EditPageAsync(blogid, pageid, username, password, page, publish);
}

[XmlRpcMethod("wp.deletePage")]
public async Task<bool> DeletePageAsync(string blogid, string username, string password, string pageid)
{
logger.LogInformation($"wp.deletePage is called");
return await provider.DeletePageAsync(blogid, username, password, pageid);
}
}
13 changes: 13 additions & 0 deletions src/Moonglade.MetaWeblog/Moonglade.MetaWeblog.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Description>Continue to maintain https://github.com/shawnwildermuth/MetaWeblog</Description>
</PropertyGroup>
<ItemGroup>
<Using Include="System.Text" />
</ItemGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
103 changes: 103 additions & 0 deletions src/Moonglade.MetaWeblog/Structs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
// ReSharper disable InconsistentNaming
namespace Moonglade.MetaWeblog;

public class BlogInfo
{
public string blogid;
public string url;
public string blogName;
}

public class CategoryInfo
{
public string description;
public string htmlUrl;
public string rssUrl;
public string title;
public string categoryid;
}

public class NewCategory
{
public string name;
public int parent_id;
public string slug;
public string description;
}

public class Tag
{
public string name;
}

public class Enclosure
{
public int length;
public string type;
public string url;
}

public class Post
{
public DateTime dateCreated;
public string description;
public string title;
public string[] categories;
public string permalink;
public object postid;
public string userid;
public string wp_slug;
public string mt_excerpt;
public string mt_keywords;
public string link;
public string wp_post_thumbnail;
public int mt_allow_comments;
public string mt_basename;
}

public class Source
{
public string name;
public string url;
}

public class UserInfo
{
public string userid;
public string firstname;
public string lastname;
public string nickname;
public string email;
public string url;
}

public class MediaObject
{
public string name;
public string type;
public string bits;
}

public class MediaObjectInfo
{
public string url;
}

public class Page
{
public DateTime dateCreated;
public string description;
public string title;
public string[] categories;
public string wp_author_id;
public string page_parent_id;
public string page_id;
}

public class Author
{
public string user_id;
public string user_login;
public string display_name;
public string meta_value;
}
Loading
Loading