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
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 RemoveSubscriptionConnection(const QString &subsName, const QString &name);
bool RenameConnection(const QString &originalName, const QString &newName);

View File

@ -71,13 +71,13 @@ namespace Qv2ray
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 fName = name;
auto fName = *name;
if (!IsValidFileName(fName + QV2RAY_CONFIG_FILE_EXTENSION)) {
fName = QObject::tr("Invalid filename") + "_" + GenerateRandomString(6) + QV2RAY_CONFIG_FILE_EXTENSION;
if (!IsValidFileName(fName)) {
fName = RemoveInvalidFileName(fName);
}
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)
}
*name = fName;
return result;
}

View File

@ -880,7 +880,9 @@ void MainWindow::on_editConfigButton_clicked()
if (isChanged) {
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 {
connections[_identifier].config = root;
// true indicates the alias will NOT change

View File

@ -134,11 +134,8 @@ void SubscribeEditor::StartUpdateSubscription(const QString &subscriptionName)
if (!errMessage.isEmpty()) {
LOG(MODULE_SUBSCRIPTION, "Processing a subscription with following error: " + errMessage)
} else {
SaveSubscriptionConfig(config, subscriptionName, &_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]);
}
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 *translator = new QTranslator();

View File

@ -39,6 +39,10 @@ namespace Qv2ray
QStringList ConvertQStringList(const QList<string> &stdListString);
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>
QString StructToJsonString(const TYPE t)
{
@ -68,12 +72,6 @@ namespace Qv2ray
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)
{
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)...));
}
/*
* 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
@ -138,28 +158,9 @@ namespace Qv2ray
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