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
jp9000 2019-02-06 22:10:08 -08:00
parent 940fd23cb4
commit fe043f2b2a
5 changed files with 163 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View File

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