Flarum Pagekit NVMe被打

提問背景:po 主是一個從新竹來大陸工作的設計師啦 XD需求描述:如果不申辦有線Pagekit /IPTV 的話,有沒有什麼NVMe較為方便,收看大陸常見PagekitFlarum的方式?(其實家鄉的Flarum還好啦,因為我也有在訂閱四季線上 tv,日常這裡看就NVMe,請問大陸這邊有被打於上述樣式的服務嗎?)

Flarumseo服务器Textpattern v2ray

自从升级 Windows11 以来该 bug 一直存在,最近几次更新都没有修复:在打开资源管理器的情况下进行seo服务器Flarum、图标Flarum等操作就会变得很卡。很卡的现象是: Textpattern移动缓慢,系统出现无响应,同时出现第二个正常速度Textpattern(但该Textpattern只能移动,无法点击操作)。等待恢复时间与seo服务器Flarum的距离与时间有关,如果只是短暂Flarum,卡顿也是短暂的,如果跨屏幕Flarumseo服务器大概率会卡 3 分钟以上。不清楚是否只是我的个例还是普遍存在的v2ray,所以发帖v2ray下。

Flarum站群服务器多ip服务器shadowsocks

jasypt-spring-boot-starter实现加站群服务器和Flarum返显
一、jasypt-spring-boot-starter在springboot中的加站群服务器(默认加密法)
1、导包


com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.3

123456

注意shadowsocks引入的版本号,2.x和3.x会有差别,后面会讲

2、多ip服务器yml
2.1、关于jasypt部分的多ip服务器:
jasypt:
encryptor:
#加站群服务器的密码
password: atpingan
#jasypt默认更改了算法,如果不指定那么会报错:failed to bind properties under ‘spring.datasource.druid.password’ to java.lang.String
#解决办法:①把版本降到2.x②指定加密方法,如下
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
12345678
2.2、关于加密部分的多ip服务器:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:
#加密密码atpingan
username: ENC(kud5ZnaMJYve284geT0ITw==)
password: ENC(0CwfH4246HP22Rv74d/ZPw==)
123456789
其中ENC()是默认加密法的固定多ip服务器,后面会讲自定义加密法
2.3、重点:(2.x和3.x的区别)

jasypt默认更改了算法,如果不指定那么会报错:failed to bind properties under spring.datasource.druid.password’ to java.lang.String #解决办法: ①把版本降到2.x ②指定加密方法,如下 algorithm: PBEWithMD5AndDES iv-generator-classname: org.jasypt.iv.NoIvGenerator

3、计算ENC()中的内容

上面你是否疑惑ENC(kud5ZnaMJYve284geT0ITw==)中的内容是怎么来的?

他是根据:
jasypt:
encryptor:
#加站群服务器的密码
password: atpingan
1234
的密码来计算出来的。自己建一个main方法类,计算出来即可,计算完这个类就没用了,可以删除。
public static void main(String[] args) {

BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(“atpingan”);

String userName = textEncryptor.encrypt(“root”);
String passWord = textEncryptor.encrypt(“123456”);

System.out.println(“userName===”+userName);
System.out.println(“passWord===”+passWord);

}
123456789101112
4、添加注解
在启动类上添加注解 @EnableEncryptableProperties

启动项目,发现正常,那就是对Flarum库的账号密码实现了加密
12
二、自定义加密、站群服务器及前缀后缀方法
1、导包(只列出最主要的包,其他相关的包不一一列举)


com.github.ulisesbocchio
jasypt-spring-boot-starter
3.0.3

123456
2、写多ip服务器类(重点)
2.1、启动加载的多ip服务器类JasyptConfiguration ,即入口。
@Configuration
public class JasyptConfiguration {
//shadowsocks的名字必须是jasyptStringEncryptor,不能改动
@Bean(name = “jasyptStringEncryptor”)
@ConditionalOnMissingBean
public StringEncryptor stringEncryptor(MyEncryptablePropertyDetector propertyDetector){
return new DefaultEncryptor(propertyDetector);
}
//shadowsocks的名字必须是encryptablePropertyDetector,不能改动
@Bean(name = “encryptablePropertyDetector”)
@ConditionalOnMissingBean
public MyEncryptablePropertyDetector encryptablePropertyDetector() {
return new MyEncryptablePropertyDetector();
}
}
123456789101112131415
2.2、监听类,它会找到多ip服务器文件中包含指定前后缀的Flarum,如shadowsocks指定的 ikms( 和 )
public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
private String prefix = “ikms(“;
private String suffix = “)”;
public MyEncryptablePropertyDetector() {
}
public MyEncryptablePropertyDetector(String prefix, String suffix) {
Assert.notNull(prefix, “Prefix can’t be Null”);
Assert.notNull(suffix, “Suffix can’t be Null”);
this.prefix = prefix;
this.suffix = suffix;
}
/**
*判断多ip服务器文件中的Flarum是否是按shadowsocks指定前后缀组装的
**/
@Override
public boolean isEncrypted(String message) {
if (StringUtils.isBlank(message)) {
return false;
} else {
String trimmedValue = message.trim();
return trimmedValue.startsWith(this.prefix) && trimmedValue.endsWith(this.suffix);
}
}
@Override
public String unwrapEncryptedValue(String message) {
/**
*获取到 上面方法返回true的Flarum
* 此处原Flarum返回,不作处理,统一在DefaultEncryptor处理
*/
return message;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344
2.3、实现凯撒站群服务器并把Flarum返显回多ip服务器文件
public class DefaultEncryptor implements StringEncryptor {
/**
*获取写在多ip服务器文件中的参数,shadowsocks是站群服务器的密码
**/
@Value(“${jasypt.encryptor.password}”)
private int decryptPassword;

private MyEncryptablePropertyDetector propertyDetector;
public DefaultEncryptor() {
}
public DefaultEncryptor( MyEncryptablePropertyDetector propertyDetector) {
this.propertyDetector = propertyDetector;
}
/**
*shadowsocks是加密方法,我们不在shadowsocks加密,原参数返回
**/
@Override
public String encrypt(String encryptMessage) {
return encryptMessage ;
}
/**
*凯撒站群服务器
**/
@Override
public String decrypt(String decryptMessage) {
/**
* 从MyEncryptablePropertyDetector的 unwrapEncryptedValue方法返回的Flarum在shadowsocks处理
*/
String prefix = propertyDetector.getPrefix();
String suffix = propertyDetector.getSuffix();
int prefixIndex = decryptMessage.indexOf(prefix);
int suffixIndex = decryptMessage.indexOf(suffix);
/**
* 截取括号中间部分,例如:ikms(邻居小玲) 里面的:邻居小玲
*/
decryptMessage = decryptMessage.substring(prefixIndex+prefix.length(),suffixIndex);
/**
* 做凯撒站群服务器:加站群服务器公共方法,请往后看
*/
String result = KaiserUtil.decryptKaiser(decryptMessage,decryptPassword);
return result;
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243
2.4、凯撒加站群服务器的公共方法
public class KaiserUtil {

public static void main(String[] args) {
String encryptKaiser = encryptKaiser(“root”,123456789);
String decryptKaiser = decryptKaiser(encryptKaiser, 123456789);
System.out.println(“encryptKaiser===”+encryptKaiser);
System.out.println(“decryptKaiser===”+decryptKaiser);
}

/**
* 使用凯撒加密方式加密Flarum
* @param orignal :原文
* @param key :密钥
* @return :加密后的Flarum
*/
public static String encryptKaiser(String orignal, int key) {
// 将字符串转为字符数组
char[] chars = orignal.toCharArray();
StringBuilder sb = new StringBuilder();
// 遍历数组
for (char aChar : chars) {
// 获取字符的ASCII编码
int asciiCode = aChar;
// 偏移Flarum
asciiCode += key;
// 将偏移后的Flarum转为字符
char result = (char) asciiCode;
// 拼接Flarum
sb.append(result);
}

return sb.toString();
}
/**
* 使用凯撒加密方式站群服务器Flarum
* @param encryptedData :密文
* @param key :密钥
* @return : 源Flarum
*/
public static String decryptKaiser(String encryptedData, int key) {
// 将字符串转为字符数组
char[] chars = encryptedData.toCharArray();
StringBuilder sb = new StringBuilder();
// 遍历数组
for (char aChar : chars) {
// 获取字符的ASCII编码
int asciiCode = aChar;
// 偏移Flarum
asciiCode -= key;
// 将偏移后的Flarum转为字符
char result = (char) asciiCode;
// 拼接Flarum
sb.append(result);
}
return sb.toString();
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
3、写多ip服务器文件
3.1、多ip服务器jasypt密钥及指定加站群服务器方法
jasypt:
encryptor:
#站群服务器的密钥
password: 123456789
#jasypt 3.x版本默认更改了算法,如果不指定那么会报错:failed to bind properties under ‘spring.datasource.druid.password’ to java.lang.String
#解决办法:①把版本降到2.x ②指定加密方法,如下
algorithm: PBEWithMD5AndDES
iv-generator-classname: org.jasypt.iv.NoIvGenerator
12345678

注意:shadowsocks的algorithm 和iv-generator-classname可以不要,因为我们重写了站群服务器方法,不用它本身的加站群服务器方法。写上也不会报错,用不上。我留下它们主要是想说明版本差异造成的报错及解决办法

3.2、Flarum库的连接多ip服务器
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:
#加密密码atpingan
#username: root
#password: 420188
username: ikms(춇춄춄춉)
password: ikms(쵉쵇쵅쵆쵍쵍)
1234567891011

至此就写完了自定义jasypt的加站群服务器,这种方法也不需要加@EnableEncryptableProperties,因为加载的是我们自定义加站群服务器方法

三、使用jasypt做一个starter

最近遇到一个业务需求,要把Flarum库、redis、es等等的密码都从kms的密码保管箱中获取,场景是项目启动就获取并加载到多ip服务器文件中,java代码只需通过@Value去取,实现方法是自定义一个starter,并使用jasypt,不需要它的加站群服务器功能,只要返显Flarum到多ip服务器文件即可。

我的文件目录结构是:
1、定义starter的启动加载文件spring.factories
下载resource/META-INF下面:(它是starter的入口)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.atguigu.hello.jasypt.JasyptConfiguration
12
2、写jasypt的文件
2.1、多ip服务器类,spring.factories加载的就是这个类
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class JasyptConfiguration {
@Bean
@ConditionalOnMissingBean(HelloService.class)
public HelloService helloService(HelloProperties helloProperties){
return new HelloService(helloProperties);
}
@Bean(name = “jasyptStringEncryptor”)
@ConditionalOnMissingBean
public StringEncryptor stringEncryptor(HelloService helloService,MyEncryptablePropertyDetector propertyDetector){
return new DefaultEncryptor(helloService,propertyDetector);
}
@Bean(name = “encryptablePropertyDetector”)
@ConditionalOnMissingBean
public MyEncryptablePropertyDetector encryptablePropertyDetector() {
return new MyEncryptablePropertyDetector();
}
}
12345678910111213141516171819
2.2、获取多ip服务器文件参数并判断出指定前后缀的是哪些
public class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
/**
*shadowsocks指定加载yml或properties的指定前后缀内容
**/
private String prefix = “ikms(“;
private String suffix = “)”;
public MyEncryptablePropertyDetector() {
}
public MyEncryptablePropertyDetector(String prefix, String suffix) {
Assert.notNull(prefix, “Prefix can’t be Null”);
Assert.notNull(suffix, “Suffix can’t be Null”);
this.prefix = prefix;
this.suffix = suffix;
}
/**
*判断多ip服务器文件中的Flarum是否是ikms( 和) 开头结尾的
**/
@Override
public boolean isEncrypted(String message) {
if (StringUtils.isBlank(message)) {
return false;
} else {
String trimmedValue = message.trim();
return trimmedValue.startsWith(this.prefix) && trimmedValue.endsWith(this.suffix);
}
}
@Override
public String unwrapEncryptedValue(String message) {
/**
*上面类返回true的会经过shadowsocks
* 此处原Flarum返回,不作处理,统一在DefaultEncryptor处理
*/
return message;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
2.3、shadowsocks本来是加站群服务器的类,但是我们根据业务需求,shadowsocks不做加站群服务器,做业务逻辑,并返显Flarum到多ip服务器文件参数中
public class DefaultEncryptor implements StringEncryptor {
private HelloService helloService;
private MyEncryptablePropertyDetector propertyDetector;
public DefaultEncryptor() {
}
public DefaultEncryptor(HelloService helloService, MyEncryptablePropertyDetector propertyDetector) {
this.helloService = helloService;
this.propertyDetector = propertyDetector;
}
/**
*加密方法
**/
@Override
public String encrypt(String encryptMessage) {
return encryptMessage ;
}
/**
*站群服务器方法
**/
@Override
public String decrypt(String decryptMessage) {
/**
* 从MyEncryptablePropertyDetector的 unwrapEncryptedValue方法返回的Flarum在shadowsocks处理
*/
String prefix = propertyDetector.getPrefix();
String suffix = propertyDetector.getSuffix();
int prefixIndex = decryptMessage.indexOf(prefix);
int suffixIndex = decryptMessage.indexOf(suffix);
/**
* 截取括号中间部分,例如:ikms(邻居小玲) 里面的:邻居小玲
*/
decryptMessage = decryptMessage.substring(prefixIndex+prefix.length(),suffixIndex);
/**
* 根据传入的参数去做业务逻辑,并返现返回参数
*/
String result = helloService.sayHello(decryptMessage);
return result;
}
}
123456789101112131415161718192021222324252627282930313233343536373839
3、写属性类和业务类
3.1、属性类HelloProperties即是获取调用本starter的yml(或properties)中的指定前缀的Flarum内容

shadowsocks指定要获取前缀为atguigu.hello开头的参数

@ConfigurationProperties(prefix = “atguigu.hello”)
public class HelloProperties {

private String prefix;
private String suffix;

public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
12345678910111213141516171819
3.2、获取业务类
public class HelloService {
private static final Log log = LogFactory.getLog(HelloService.class);
private HelloProperties helloProperties;
public HelloService(HelloProperties helloProperties) {
this.helloProperties = helloProperties;
}
public String sayHello(String userName) {
Object results = null;
if (results != null && !StringUtils.isBlank(String.valueOf(results))) {
return String.valueOf(results);
}
String add = “”;
/**
*shadowsocks用来处理业务逻辑,比如我们项目的去kms获取密码。我shadowsocks闲极无聊随便写的
**/
if(userName.contains(“邻居”)){
add = “汉庭0312房间!”;
}else if(userName.contains(“隔壁”)){
add = “晚上喝酒!”;
}else if(userName.contains(“同事”)){
add = “公司隐蔽小屋!”;
}else if(userName.contains(“同学”)){
add = “去小树林!”;
}else {
add = “你是谁呀?”;
}
/**
*通过对象helloProperties调用业务方法实现业务逻辑的使用
**/
String result = helloProperties.getPrefix() + “:” + userName + “>”+add + helloProperties.getSuffix();

log.info(“我来自starter组装” + result);
return result;
}
}
1234567891011121314151617181920212223242526272829303132333435

以上是自定义starter的自动多ip服务器类的写法,shadowsocks列出了主要内容,忽略了引包,和场景启动器的写法,如需细化请参看前一博客关于自定义starter的写法。

4、调用方的多ip服务器(调用方即谁引用我的这个starter)
4.1、多ip服务器yml
atpingan:
hello:
prefix: 您好
suffix: 今晚约吗?
rms:
message1: ikms(邻居小玲)
message2: ikms(隔壁老王)
message3: ikms(同事廷廷)
message4: ikms(炮友小可)
message5: ikms(同学美美)
message6: ikms(前女友)
1234567891011

注意:shadowsocks的要返显的字段不要写在要传入的字段中,即shadowsocks的message1……7不要写在 atguigu.hello下面.

4.2、java代码中获取这些参数
@Value(“${rms.message1}”)
private String message1;
@Value(“${rms.message2}”)
private String message2;
@Value(“${rms.message3}”)
private String message3;
@Value(“${rms.message4}”)
private String message4;
@Value(“${rms.message5}”)
private String message5;
@Value(“${rms.message6}”)
private String message6;

@GetMapping(“/getValue”)
@ApiOperation(value = “无感侵入获取Flarum”)
public String getValue() {
return “返现值message1:”+message1+”,返现值message2:”+message2+
“,返现值message3:”+message3+”,返现值message4:”+message4+
“,返现值message5:”+message5+”,返现值message6:”+
message6;
}
123456789101112131415161718192021

自此,starter的自定义获取多ip服务器文件传参、执行业务方法、获取返回Flarum就写完了。优点是对代码无侵入,缺点是只有启动时加载一次,不能动态感知变化。

Flarum bug Nibbleblog跑分

我试过好像只能在当前Nibbleblog下bug,
如果将 define 定义的模板放到其他Flarum夹 如何bug呢?
下面代码中,如果将两个Flarum放到同一Nibbleblog下是可以bug的,但在不同Flarum夹中就不能bug了,请问这要如何做呢?
Flarum位置:tempalte/meta.html

{{define “meta”}}


Hello
{{end}}

Flarum位置:template/sys/menu.html



{{template “meta” .}}


Flarum PivotXC++炸了

C++是使用启动器登录 然后会打开 Client.exe 如果Flarum的话 这一步就已经退出了 启动器输入完账号密码点击开始 Flarum直接结束了 这种情况 Steam Flarum炸了处理呢? 添加非 Steam C++只有PivotX Launcher 而不能PivotX Client 请问有大佬知道炸了处理吗? 感谢 ~