/* This file is part of mastobotmon. * Copyright © 2018 tastytea * * 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, version 3. * * 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 . */ #include #include #include // strlen() #include // getenv() #include #include #include #include "version.hpp" #include "mastobotmon.hpp" using std::string; using std::cout; using std::cin; using std::cerr; using std::uint16_t; const string filepath = string(std::getenv("HOME")) + "/.config/mastobotmon.json"; const bool read_config(Json::Value &document) { std::ifstream file(filepath); std::stringstream json; if (file.is_open()) { json << file.rdbuf(); file.close(); Json::Reader reader; if (!reader.parse(json, document)) { cerr << "ERROR: couldn't parse config file. Are you sure the JSON is well-formed?\n"; return false; } if (!document["accounts"].isObject()) { cerr << "ERROR: \"accounts\" not found\n"; return false; } if (!document["mode"].isString()) { cerr << "ERROR: \"mode\" not found\n"; return false; } if (!document["daemon_check"].isUInt()) { cerr << "ERROR: \"daemon_check\" not found\n"; return false; } if (!document["data_dir"].isString()) { cerr << "ERROR: \"data_dir\" not found\n"; return false; } } else { cout << "No config file found. Creating new one.\n"; add_account(document); document["mode"] = "cron"; document["daemon_check"] = 10; document["data_dir"] = "."; return write_config(document); } return true; } const string get_access_token(const string &account) { const string instance = account.substr(account.find('@') + 1); Account acc(instance, ""); acc.set_useragent("mastobotmon/" + string(global::version)); uint16_t ret; string client_id; string client_secret; string url; string code; string access_token = ""; ret = acc.register_app1("mastobotmon", "urn:ietf:wg:oauth:2.0:oob", "read", "https://github.com/tastytea/mastobotmon", client_id, client_secret, url); if (ret == 0) { cout << "Visit " << url << " and paste the generated code\nhere: "; cin >> code; ret = acc.register_app2(client_id, client_secret, "urn:ietf:wg:oauth:2.0:oob", code, access_token); if (ret == 0) { return access_token; } } cerr << "Error: " << ret << '\n'; return ""; } const bool add_account(Json::Value &document) { string account; string minutes; string access_token; cout << "Adding accounts (user@domain), blank line to stop.\n"; while (true) { cout << "Add Account: "; std::getline(cin, account); if (account.empty()) { break; } cout << "Minutes af allowed inactivity: "; std::getline(cin, minutes); access_token = get_access_token(account); document["accounts"][account]["minutes"] = std::stoi(minutes); document["accounts"][account]["access_token"] = access_token; } return write_config(document); } const bool write_config(Json::Value &document) { Json::StyledWriter writer; const string output = writer.write(document); std::ofstream outfile(filepath); if (outfile.is_open()) { outfile.write(output.c_str(), output.length()); outfile.close(); return true; } return false; }