mirror of
https://github.com/Qv2ray/Qv2ray.git
synced 2025-05-20 02:40:20 +08:00
fix: fixed Subscription Import filename issue
This commit is contained in:
parent
37c0d61d73
commit
5aa67d8cbe
@ -1 +1 @@
|
|||||||
2965
|
2982
|
||||||
|
@ -34,7 +34,7 @@ namespace Qv2ray
|
|||||||
//
|
//
|
||||||
// Save Connection Config
|
// Save Connection Config
|
||||||
bool SaveConnectionConfig(CONFIGROOT obj, QString *alias, bool canOverrideExisting);
|
bool SaveConnectionConfig(CONFIGROOT obj, QString *alias, bool canOverrideExisting);
|
||||||
bool SaveSubscriptionConfig(CONFIGROOT obj, const QString &subscription, const QString &name);
|
bool SaveSubscriptionConfig(CONFIGROOT obj, const QString &subscription, QString *name);
|
||||||
bool RemoveConnection(const QString &alias);
|
bool RemoveConnection(const QString &alias);
|
||||||
bool RemoveSubscriptionConnection(const QString &subsName, const QString &name);
|
bool RemoveSubscriptionConnection(const QString &subsName, const QString &name);
|
||||||
bool RenameConnection(const QString &originalName, const QString &newName);
|
bool RenameConnection(const QString &originalName, const QString &newName);
|
||||||
|
@ -71,13 +71,13 @@ namespace Qv2ray
|
|||||||
return StringToFile(&str, config);
|
return StringToFile(&str, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SaveSubscriptionConfig(CONFIGROOT obj, const QString &subscription, const QString &name)
|
bool SaveSubscriptionConfig(CONFIGROOT obj, const QString &subscription, QString *name)
|
||||||
{
|
{
|
||||||
auto str = JsonToString(obj);
|
auto str = JsonToString(obj);
|
||||||
auto fName = name;
|
auto fName = *name;
|
||||||
|
|
||||||
if (!IsValidFileName(fName + QV2RAY_CONFIG_FILE_EXTENSION)) {
|
if (!IsValidFileName(fName)) {
|
||||||
fName = QObject::tr("Invalid filename") + "_" + GenerateRandomString(6) + QV2RAY_CONFIG_FILE_EXTENSION;
|
fName = RemoveInvalidFileName(fName);
|
||||||
}
|
}
|
||||||
|
|
||||||
QFile *config = new QFile(QV2RAY_SUBSCRIPTION_DIR + subscription + "/" + fName + QV2RAY_CONFIG_FILE_EXTENSION);
|
QFile *config = new QFile(QV2RAY_SUBSCRIPTION_DIR + subscription + "/" + fName + QV2RAY_CONFIG_FILE_EXTENSION);
|
||||||
@ -94,6 +94,7 @@ namespace Qv2ray
|
|||||||
LOG(MODULE_FILE, "Failed to save a connection config from subscription: " + subscription + ", name: " + fName)
|
LOG(MODULE_FILE, "Failed to save a connection config from subscription: " + subscription + ", name: " + fName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*name = fName;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -880,7 +880,9 @@ void MainWindow::on_editConfigButton_clicked()
|
|||||||
|
|
||||||
if (isChanged) {
|
if (isChanged) {
|
||||||
if (CheckConfigType(firstSelected, SUBSCRIPTION)) {
|
if (CheckConfigType(firstSelected, SUBSCRIPTION)) {
|
||||||
SaveSubscriptionConfig(root, connections[_identifier].subscriptionName, connections[_identifier].connectionName);
|
auto name = connections[_identifier].connectionName;
|
||||||
|
// Assume name will not change.
|
||||||
|
SaveSubscriptionConfig(root, connections[_identifier].subscriptionName, &name);
|
||||||
} else {
|
} else {
|
||||||
connections[_identifier].config = root;
|
connections[_identifier].config = root;
|
||||||
// true indicates the alias will NOT change
|
// true indicates the alias will NOT change
|
||||||
|
@ -134,11 +134,8 @@ void SubscribeEditor::StartUpdateSubscription(const QString &subscriptionName)
|
|||||||
if (!errMessage.isEmpty()) {
|
if (!errMessage.isEmpty()) {
|
||||||
LOG(MODULE_SUBSCRIPTION, "Processing a subscription with following error: " + errMessage)
|
LOG(MODULE_SUBSCRIPTION, "Processing a subscription with following error: " + errMessage)
|
||||||
} else {
|
} else {
|
||||||
|
SaveSubscriptionConfig(config, subscriptionName, &_alias);
|
||||||
connectionsList->addItem(_alias);
|
connectionsList->addItem(_alias);
|
||||||
|
|
||||||
if (!SaveSubscriptionConfig(config, subscriptionName, _alias)) {
|
|
||||||
// Cannot save.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,6 +179,21 @@ namespace Qv2ray
|
|||||||
return strcat(strcat(str, " "), sizes[i]);
|
return strcat(strcat(str, " "), sizes[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsValidFileName(const QString &fileName)
|
||||||
|
{
|
||||||
|
QString name = fileName;
|
||||||
|
return name == RemoveInvalidFileName(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString RemoveInvalidFileName(const QString &fileName)
|
||||||
|
{
|
||||||
|
std::string _name = fileName.toStdString();
|
||||||
|
std::replace_if(_name.begin(), _name.end(), [](char c) {
|
||||||
|
return std::string::npos != string(R"("/\?%&^*;:|><)").find(c);
|
||||||
|
}, '_');
|
||||||
|
return QString::fromStdString(_name);
|
||||||
|
}
|
||||||
|
|
||||||
QTranslator *getTranslator(const QString &lang)
|
QTranslator *getTranslator(const QString &lang)
|
||||||
{
|
{
|
||||||
QTranslator *translator = new QTranslator();
|
QTranslator *translator = new QTranslator();
|
||||||
|
@ -39,6 +39,10 @@ namespace Qv2ray
|
|||||||
QStringList ConvertQStringList(const QList<string> &stdListString);
|
QStringList ConvertQStringList(const QList<string> &stdListString);
|
||||||
std::list<string> ConvertStdStringList(const QStringList &qStringList);
|
std::list<string> ConvertStdStringList(const QStringList &qStringList);
|
||||||
//
|
//
|
||||||
|
// This function cannot be marked as inline.
|
||||||
|
QString RemoveInvalidFileName(const QString &fileName);
|
||||||
|
bool IsValidFileName(const QString &fileName);
|
||||||
|
//
|
||||||
template <typename TYPE>
|
template <typename TYPE>
|
||||||
QString StructToJsonString(const TYPE t)
|
QString StructToJsonString(const TYPE t)
|
||||||
{
|
{
|
||||||
@ -68,12 +72,6 @@ namespace Qv2ray
|
|||||||
vec.erase(it);
|
vec.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool IsValidFileName(const QString &str)
|
|
||||||
{
|
|
||||||
// If no match, we are good.
|
|
||||||
return QRegExp(R"([\/\\\"?%*:|><]|(^\.{1,2}$))").indexIn(str) == -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool IsIPv6Address(const QString &addr)
|
inline bool IsIPv6Address(const QString &addr)
|
||||||
{
|
{
|
||||||
return QRegularExpression(REGEX_IPV6_ADDR).match(addr).hasMatch();
|
return QRegularExpression(REGEX_IPV6_ADDR).match(addr).hasMatch();
|
||||||
@ -108,6 +106,28 @@ namespace Qv2ray
|
|||||||
{
|
{
|
||||||
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generic function to find if an element of any type exists in list
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
bool contains(std::list<T> &listOfElements, const T &element)
|
||||||
|
{
|
||||||
|
// Find the iterator if element in list
|
||||||
|
auto it = std::find(listOfElements.begin(), listOfElements.end(), element);
|
||||||
|
//return if iterator points to end or not. It points to end then it means element
|
||||||
|
// does not exists in list
|
||||||
|
return it != listOfElements.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QString timeToString(const time_t &t)
|
||||||
|
{
|
||||||
|
auto _tm = std::localtime(&t);
|
||||||
|
char MY_TIME[128];
|
||||||
|
// using strftime to display time
|
||||||
|
strftime(MY_TIME, sizeof(MY_TIME), "%x - %I:%M%p", _tm);
|
||||||
|
return QString(MY_TIME);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace mapExt
|
namespace mapExt
|
||||||
@ -138,28 +158,9 @@ namespace Qv2ray
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Generic function to find if an element of any type exists in list
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
bool contains(std::list<T> &listOfElements, const T &element)
|
|
||||||
{
|
|
||||||
// Find the iterator if element in list
|
|
||||||
auto it = std::find(listOfElements.begin(), listOfElements.end(), element);
|
|
||||||
//return if iterator points to end or not. It points to end then it means element
|
|
||||||
// does not exists in list
|
|
||||||
return it != listOfElements.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline QString timeToString(const time_t &t)
|
|
||||||
{
|
|
||||||
auto _tm = std::localtime(&t);
|
|
||||||
char MY_TIME[128];
|
|
||||||
// using strftime to display time
|
|
||||||
strftime(MY_TIME, sizeof(MY_TIME), "%x - %I:%M%p", _tm);
|
|
||||||
return QString(MY_TIME);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using namespace Qv2ray::Utils;
|
||||||
|
using namespace Qv2ray::mapExt;
|
||||||
|
|
||||||
#endif // QVHELPERS_H
|
#endif // QVHELPERS_H
|
||||||
|
Loading…
Reference in New Issue
Block a user