fix: fixed Subscription Import filename issue

This commit is contained in:
Qv2ray Bot 2020-01-20 11:24:19 +08:00
parent 37c0d61d73
commit 5aa67d8cbe
7 changed files with 55 additions and 39 deletions

View File

@ -1 +1 @@
2965 2982

View File

@ -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);

View File

@ -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;
} }

View File

@ -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

View File

@ -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.
}
} }
} }

View File

@ -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();

View File

@ -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