UI: Add per-profile browser panel cookie management
Allows the ability to switch cookies between profiles. Allows the ability to, for example, switch streaming service accounts between profiles for proper access to the pages displayed by the browser panels (such as chat windows).master
parent
940fd23cb4
commit
fe043f2b2a
|
@ -140,6 +140,7 @@ set(obs_SOURCES
|
|||
window-basic-main-transitions.cpp
|
||||
window-basic-main-dropfiles.cpp
|
||||
window-basic-main-profiles.cpp
|
||||
window-basic-main-browser.cpp
|
||||
window-basic-status-bar.cpp
|
||||
window-basic-adv-audio.cpp
|
||||
window-basic-transform.cpp
|
||||
|
|
|
@ -0,0 +1,134 @@
|
|||
/******************************************************************************
|
||||
Copyright (C) 2018 by Hugh Bailey <obs.jim@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
******************************************************************************/
|
||||
|
||||
#include <QDir>
|
||||
#include <QThread>
|
||||
#include <QMessageBox>
|
||||
#include "window-basic-main.hpp"
|
||||
#include "qt-wrappers.hpp"
|
||||
|
||||
#include <random>
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
#include <browser-panel.hpp>
|
||||
#endif
|
||||
|
||||
struct QCef;
|
||||
struct QCefCookieManager;
|
||||
|
||||
extern QCef *cef;
|
||||
extern QCefCookieManager *panel_cookies;
|
||||
|
||||
static std::string GenId()
|
||||
{
|
||||
std::random_device rd;
|
||||
std::mt19937_64 e2(rd());
|
||||
std::uniform_int_distribution<uint64_t> dist(0, 0xFFFFFFFFFFFFFFFF);
|
||||
|
||||
uint64_t id = dist(e2);
|
||||
|
||||
char id_str[20];
|
||||
snprintf(id_str, sizeof(id_str), "%16llX", (unsigned long long)id);
|
||||
return std::string(id_str);
|
||||
}
|
||||
|
||||
void CheckExistingCookieId()
|
||||
{
|
||||
OBSBasic *main = OBSBasic::Get();
|
||||
if (config_has_user_value(main->Config(), "Panels", "CookieId"))
|
||||
return;
|
||||
|
||||
config_set_string(main->Config(), "Panels", "CookieId", GenId().c_str());
|
||||
}
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
static void InitPanelCookieManager()
|
||||
{
|
||||
if (!cef)
|
||||
return;
|
||||
if (panel_cookies)
|
||||
return;
|
||||
|
||||
CheckExistingCookieId();
|
||||
|
||||
OBSBasic *main = OBSBasic::Get();
|
||||
const char *cookie_id = config_get_string(main->Config(),
|
||||
"Panels", "CookieId");
|
||||
|
||||
std::string sub_path;
|
||||
sub_path += "obs_profile_cookies/";
|
||||
sub_path += cookie_id;
|
||||
|
||||
panel_cookies = cef->create_cookie_manager(sub_path);
|
||||
}
|
||||
#endif
|
||||
|
||||
void DestroyPanelCookieManager()
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
if (panel_cookies) {
|
||||
panel_cookies->FlushStore();
|
||||
delete panel_cookies;
|
||||
panel_cookies = nullptr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void DuplicateCurrentCookieProfile(ConfigFile &config)
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
if (cef) {
|
||||
OBSBasic *main = OBSBasic::Get();
|
||||
const char *cookie_id = config_get_string(main->Config(),
|
||||
"Panels", "CookieId");
|
||||
|
||||
std::string src_path;
|
||||
src_path += "obs_profile_cookies/";
|
||||
src_path += cookie_id;
|
||||
|
||||
std::string new_id = GenId();
|
||||
|
||||
std::string dst_path;
|
||||
dst_path += "obs_profile_cookies/";
|
||||
dst_path += new_id;
|
||||
|
||||
BPtr<char> src_path_full = cef->get_cookie_path(src_path);
|
||||
BPtr<char> dst_path_full = cef->get_cookie_path(dst_path);
|
||||
|
||||
QDir srcDir(src_path_full.Get());
|
||||
QDir dstDir(dst_path_full.Get());
|
||||
|
||||
if (srcDir.exists()) {
|
||||
if (!dstDir.exists())
|
||||
dstDir.mkdir(dst_path_full.Get());
|
||||
|
||||
QStringList files = srcDir.entryList(QDir::Files);
|
||||
for (const QString &file : files) {
|
||||
QString src = QString(src_path_full);
|
||||
QString dst = QString(dst_path_full);
|
||||
src += QDir::separator() + file;
|
||||
dst += QDir::separator() + file;
|
||||
QFile::copy(src, dst);
|
||||
}
|
||||
}
|
||||
|
||||
config_set_string(config, "Panels", "CookieId", new_id.c_str());
|
||||
}
|
||||
#else
|
||||
UNUSED_PARAMETER(config);
|
||||
#endif
|
||||
}
|
|
@ -25,6 +25,10 @@
|
|||
#include "window-namedialog.hpp"
|
||||
#include "qt-wrappers.hpp"
|
||||
|
||||
extern void DestroyPanelCookieManager();
|
||||
extern void DuplicateCurrentCookieProfile(ConfigFile &config);
|
||||
extern void CheckExistingCookieId();
|
||||
|
||||
void EnumProfiles(std::function<bool (const char *, const char *)> &&cb)
|
||||
{
|
||||
char path[512];
|
||||
|
@ -182,7 +186,7 @@ static bool CopyProfile(const char *fromPartial, const char *to)
|
|||
}
|
||||
|
||||
bool OBSBasic::AddProfile(bool create_new, const char *title, const char *text,
|
||||
const char *init_text)
|
||||
const char *init_text, bool rename)
|
||||
{
|
||||
std::string newName;
|
||||
std::string newDir;
|
||||
|
@ -228,6 +232,12 @@ bool OBSBasic::AddProfile(bool create_new, const char *title, const char *text,
|
|||
config_set_string(App()->GlobalConfig(), "Basic", "ProfileDir",
|
||||
newDir.c_str());
|
||||
|
||||
if (create_new) {
|
||||
DestroyPanelCookieManager();
|
||||
} else if (!rename) {
|
||||
DuplicateCurrentCookieProfile(config);
|
||||
}
|
||||
|
||||
config_set_string(config, "General", "Name", newName.c_str());
|
||||
config.SaveSafe("tmp");
|
||||
config.Swap(basicConfig);
|
||||
|
@ -380,7 +390,7 @@ void OBSBasic::on_actionRenameProfile_triggered()
|
|||
|
||||
/* Duplicate and delete in case there are any issues in the process */
|
||||
bool success = AddProfile(false, Str("RenameProfile.Title"),
|
||||
Str("AddProfile.Text"), curName.c_str());
|
||||
Str("AddProfile.Text"), curName.c_str(), true);
|
||||
if (success) {
|
||||
DeleteProfile(curName.c_str(), curDir.c_str());
|
||||
RefreshProfiles();
|
||||
|
@ -446,6 +456,8 @@ void OBSBasic::on_actionRemoveProfile_triggered()
|
|||
config_set_string(App()->GlobalConfig(), "Basic", "ProfileDir",
|
||||
newDir);
|
||||
|
||||
DestroyPanelCookieManager();
|
||||
|
||||
config.Swap(basicConfig);
|
||||
InitBasicConfigDefaults();
|
||||
ResetProfileData();
|
||||
|
@ -603,6 +615,8 @@ void OBSBasic::ChangeProfile()
|
|||
config_set_string(App()->GlobalConfig(), "Basic", "ProfileDir",
|
||||
newDir);
|
||||
|
||||
DestroyPanelCookieManager();
|
||||
|
||||
config.Swap(basicConfig);
|
||||
InitBasicConfigDefaults();
|
||||
ResetProfileData();
|
||||
|
|
|
@ -79,7 +79,12 @@ using namespace std;
|
|||
#endif
|
||||
|
||||
struct QCef;
|
||||
QCef *cef = nullptr;
|
||||
struct QCefCookieManager;
|
||||
|
||||
QCef *cef = nullptr;
|
||||
QCefCookieManager *panel_cookies = nullptr;
|
||||
|
||||
void DestroyPanelCookieManager();
|
||||
|
||||
namespace {
|
||||
|
||||
|
@ -1097,6 +1102,8 @@ static const double scaled_vals[] =
|
|||
0.0
|
||||
};
|
||||
|
||||
extern void CheckExistingCookieId();
|
||||
|
||||
bool OBSBasic::InitBasicConfigDefaults()
|
||||
{
|
||||
QList<QScreen*> screens = QGuiApplication::screens();
|
||||
|
@ -1302,6 +1309,8 @@ bool OBSBasic::InitBasicConfigDefaults()
|
|||
VOLUME_METER_DECAY_FAST);
|
||||
config_set_default_uint (basicConfig, "Audio", "PeakMeterType", 0);
|
||||
|
||||
CheckExistingCookieId();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2247,6 +2256,7 @@ OBSBasic::~OBSBasic()
|
|||
#endif
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
DestroyPanelCookieManager();
|
||||
delete cef;
|
||||
cef = nullptr;
|
||||
#endif
|
||||
|
|
|
@ -301,7 +301,7 @@ private:
|
|||
void LoadProfile();
|
||||
void ResetProfileData();
|
||||
bool AddProfile(bool create_new, const char *title, const char *text,
|
||||
const char *init_text = nullptr);
|
||||
const char *init_text = nullptr, bool rename = false);
|
||||
void DeleteProfile(const char *profile_name, const char *profile_dir);
|
||||
void RefreshProfiles();
|
||||
void ChangeProfile();
|
||||
|
|
Loading…
Reference in New Issue