mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Merge pull request #1282 from profanity-im/feature/sqlite-log
SQLite backend
This commit is contained in:
commit
6c158a9af8
@ -21,6 +21,7 @@ packages:
|
|||||||
- libgpg-error
|
- libgpg-error
|
||||||
- libgcrypt
|
- libgcrypt
|
||||||
- libsignal-protocol-c
|
- libsignal-protocol-c
|
||||||
|
- sqlite3
|
||||||
|
|
||||||
sources:
|
sources:
|
||||||
- https://github.com/profanity-im/profanity
|
- https://github.com/profanity-im/profanity
|
||||||
|
@ -28,6 +28,7 @@ matrix:
|
|||||||
- PKG_CONFIG_PATH="/usr/local/opt/curl/lib/pkgconfig:$PKG_CONFIG_PATH"
|
- PKG_CONFIG_PATH="/usr/local/opt/curl/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
- PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
|
- PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
- PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig:$PKG_CONFIG_PATH"
|
- PKG_CONFIG_PATH="/usr/local/opt/libffi/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
- PKG_CONFIG_PATH="/usr/local/opt/sqlite/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- >
|
- >
|
||||||
|
@ -19,3 +19,4 @@ brew 'openssl'
|
|||||||
brew 'ossp-uuid'
|
brew 'ossp-uuid'
|
||||||
brew 'pkg-config'
|
brew 'pkg-config'
|
||||||
brew 'readline'
|
brew 'readline'
|
||||||
|
brew 'sqlite'
|
||||||
|
@ -25,7 +25,8 @@ RUN pacman -Syu --noconfirm && pacman -S --needed --noconfirm \
|
|||||||
openssl \
|
openssl \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
python \
|
python \
|
||||||
wget
|
wget \
|
||||||
|
sqlite
|
||||||
|
|
||||||
RUN mkdir -p /usr/src/{stabber,profanity}
|
RUN mkdir -p /usr/src/{stabber,profanity}
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
libxss-dev \
|
libxss-dev \
|
||||||
make \
|
make \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
python-dev
|
python-dev \
|
||||||
|
libsqlite3-dev
|
||||||
|
|
||||||
RUN mkdir -p /usr/src/{stabber,libmesode,profanity}
|
RUN mkdir -p /usr/src/{stabber,libmesode,profanity}
|
||||||
WORKDIR /usr/src
|
WORKDIR /usr/src
|
||||||
|
@ -33,7 +33,8 @@ RUN zypper --non-interactive in --no-recommends \
|
|||||||
python-devel \
|
python-devel \
|
||||||
python3 \
|
python3 \
|
||||||
python3-devel \
|
python3-devel \
|
||||||
readline-devel
|
readline-devel \
|
||||||
|
sqlite3-devel
|
||||||
|
|
||||||
# https://github.com/openSUSE/docker-containers-build/issues/26
|
# https://github.com/openSUSE/docker-containers-build/issues/26
|
||||||
ENV LANG en_US.UTF-8
|
ENV LANG en_US.UTF-8
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
core_sources = \
|
core_sources = \
|
||||||
src/xmpp/contact.c src/xmpp/contact.h src/log.c src/common.c \
|
src/xmpp/contact.c src/xmpp/contact.h \
|
||||||
|
src/log.c src/common.c \
|
||||||
|
src/database.h src/database.c \
|
||||||
src/log.h src/profanity.c src/common.h \
|
src/log.h src/profanity.c src/common.h \
|
||||||
src/profanity.h src/xmpp/chat_session.c \
|
src/profanity.h src/xmpp/chat_session.c \
|
||||||
src/xmpp/chat_session.h src/xmpp/muc.c src/xmpp/muc.h src/xmpp/jid.h src/xmpp/jid.c \
|
src/xmpp/chat_session.h src/xmpp/muc.c src/xmpp/muc.h src/xmpp/jid.h src/xmpp/jid.c \
|
||||||
@ -110,6 +112,7 @@ unittest_sources = \
|
|||||||
tests/unittests/xmpp/stub_message.c \
|
tests/unittests/xmpp/stub_message.c \
|
||||||
tests/unittests/ui/stub_ui.c tests/unittests/ui/stub_ui.h \
|
tests/unittests/ui/stub_ui.c tests/unittests/ui/stub_ui.h \
|
||||||
tests/unittests/log/stub_log.c \
|
tests/unittests/log/stub_log.c \
|
||||||
|
tests/unittests/database/stub_database.c \
|
||||||
tests/unittests/config/stub_accounts.c \
|
tests/unittests/config/stub_accounts.c \
|
||||||
tests/unittests/tools/stub_http_upload.c \
|
tests/unittests/tools/stub_http_upload.c \
|
||||||
tests/unittests/helpers.c tests/unittests/helpers.h \
|
tests/unittests/helpers.c tests/unittests/helpers.h \
|
||||||
|
@ -179,6 +179,9 @@ PKG_CHECK_MODULES([curl], [libcurl], [],
|
|||||||
[AC_CHECK_LIB([curl], [main], [],
|
[AC_CHECK_LIB([curl], [main], [],
|
||||||
[AC_MSG_ERROR([libcurl is required for profanity])])])
|
[AC_MSG_ERROR([libcurl is required for profanity])])])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.30.0], [],
|
||||||
|
[AC_MSG_ERROR([sqlite3 3.30.0 or higher is required for profanity profanity])])
|
||||||
|
|
||||||
AS_IF([test "x$enable_icons_and_clipboard" != xno],
|
AS_IF([test "x$enable_icons_and_clipboard" != xno],
|
||||||
[PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.24.10],
|
[PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.24.10],
|
||||||
[AC_DEFINE([HAVE_GTK], [1], [libgtk module])],
|
[AC_DEFINE([HAVE_GTK], [1], [libgtk module])],
|
||||||
@ -332,9 +335,9 @@ AS_IF([test "x$PACKAGE_STATUS" = xdevelopment],
|
|||||||
AS_IF([test "x$PLATFORM" = xosx],
|
AS_IF([test "x$PLATFORM" = xosx],
|
||||||
[AM_CFLAGS="$AM_CFLAGS -Qunused-arguments"])
|
[AM_CFLAGS="$AM_CFLAGS -Qunused-arguments"])
|
||||||
AM_LDFLAGS="$AM_LDFLAGS -export-dynamic"
|
AM_LDFLAGS="$AM_LDFLAGS -export-dynamic"
|
||||||
AM_CPPFLAGS="$AM_CPPFLAGS $glib_CFLAGS $gio_CFLAGS $curl_CFLAGS $libnotify_CFLAGS $PYTHON_CPPFLAGS ${GTK_CFLAGS}"
|
AM_CPPFLAGS="$AM_CPPFLAGS $glib_CFLAGS $gio_CFLAGS $curl_CFLAGS $libnotify_CFLAGS $PYTHON_CPPFLAGS ${GTK_CFLAGS} ${SQLITE_CFLAGS}"
|
||||||
AM_CPPFLAGS="$AM_CPPFLAGS -DTHEMES_PATH=\"\\\"$THEMES_PATH\\\"\" -DICONS_PATH=\"\\\"$ICONS_PATH\\\"\""
|
AM_CPPFLAGS="$AM_CPPFLAGS -DTHEMES_PATH=\"\\\"$THEMES_PATH\\\"\" -DICONS_PATH=\"\\\"$ICONS_PATH\\\"\""
|
||||||
LIBS="$glib_LIBS $gio_LIBS $curl_LIBS $libnotify_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_LDFLAGS ${GTK_LIBS} $LIBS"
|
LIBS="$glib_LIBS $gio_LIBS $curl_LIBS $libnotify_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_LDFLAGS ${GTK_LIBS} ${SQLITE_LIBS} $LIBS"
|
||||||
|
|
||||||
AC_SUBST(AM_LDFLAGS)
|
AC_SUBST(AM_LDFLAGS)
|
||||||
AC_SUBST(AM_CFLAGS)
|
AC_SUBST(AM_CFLAGS)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
* vim: expandtab:ts=4:sts=4:sw=4
|
* vim: expandtab:ts=4:sts=4:sw=4
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com>
|
* Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com>
|
||||||
|
* Copyright (C) 2020 Michael Vetter <jubalh@idoru.org>
|
||||||
*
|
*
|
||||||
* This file is part of Profanity.
|
* This file is part of Profanity.
|
||||||
*
|
*
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#define DIR_PGP "pgp"
|
#define DIR_PGP "pgp"
|
||||||
#define DIR_OMEMO "omemo"
|
#define DIR_OMEMO "omemo"
|
||||||
#define DIR_PLUGINS "plugins"
|
#define DIR_PLUGINS "plugins"
|
||||||
|
#define DIR_DATABASE "database"
|
||||||
|
|
||||||
void files_create_directories(void);
|
void files_create_directories(void);
|
||||||
|
|
||||||
|
325
src/database.c
Normal file
325
src/database.c
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
/*
|
||||||
|
* database.c
|
||||||
|
* vim: expandtab:ts=4:sts=4:sw=4
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Michael Vetter <jubalh@idoru.org>
|
||||||
|
*
|
||||||
|
* This file is part of Profanity.
|
||||||
|
*
|
||||||
|
* Profanity 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Profanity 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 Profanity. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link the code of portions of this program with the OpenSSL library under
|
||||||
|
* certain conditions as described in each individual source file, and
|
||||||
|
* distribute linked combinations including the two.
|
||||||
|
*
|
||||||
|
* You must obey the GNU General Public License in all respects for all of the
|
||||||
|
* code used other than OpenSSL. If you modify file(s) with this exception, you
|
||||||
|
* may extend this exception to your version of the file(s), but you are not
|
||||||
|
* obligated to do so. If you do not wish to do so, delete this exception
|
||||||
|
* statement from your version. If you delete this exception statement from all
|
||||||
|
* source files in the program, then also delete it here.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE 1
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sqlite3.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
#include "config/files.h"
|
||||||
|
|
||||||
|
static sqlite3 *g_chatlog_database;
|
||||||
|
|
||||||
|
static void _add_to_db(ProfMessage *message, char *type, const Jid * const from_jid, const Jid * const to_jid);
|
||||||
|
static char* _get_db_filename(ProfAccount *account);
|
||||||
|
|
||||||
|
static char*
|
||||||
|
_get_db_filename(ProfAccount *account)
|
||||||
|
{
|
||||||
|
char *databasedir = files_get_data_path(DIR_DATABASE);
|
||||||
|
GString *basedir = g_string_new(databasedir);
|
||||||
|
free(databasedir);
|
||||||
|
|
||||||
|
g_string_append(basedir, "/");
|
||||||
|
|
||||||
|
gchar *account_dir = str_replace(account->jid, "@", "_at_");
|
||||||
|
g_string_append(basedir, account_dir);
|
||||||
|
free(account_dir);
|
||||||
|
|
||||||
|
int res = g_mkdir_with_parents(basedir->str, S_IRWXU);
|
||||||
|
if (res == -1) {
|
||||||
|
char *errmsg = strerror(errno);
|
||||||
|
if (errmsg) {
|
||||||
|
log_error("DATABASE: error creating directory: %s, %s", basedir->str, errmsg);
|
||||||
|
} else {
|
||||||
|
log_error("DATABASE: creating directory: %s", basedir->str);
|
||||||
|
}
|
||||||
|
g_string_free(basedir, TRUE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_append(basedir, "/chatlog.db");
|
||||||
|
char *result = strdup(basedir->str);
|
||||||
|
g_string_free(basedir, TRUE);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
log_database_init(ProfAccount *account)
|
||||||
|
{
|
||||||
|
int ret = sqlite3_initialize();
|
||||||
|
if (ret != SQLITE_OK) {
|
||||||
|
log_error("Error initializing SQLite database: %d", ret);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *filename = _get_db_filename(account);
|
||||||
|
if (!filename) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sqlite3_open(filename, &g_chatlog_database);
|
||||||
|
if (ret != SQLITE_OK) {
|
||||||
|
const char *err_msg = sqlite3_errmsg(g_chatlog_database);
|
||||||
|
log_error("Error opening SQLite database: %s", err_msg);
|
||||||
|
free(filename);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *err_msg;
|
||||||
|
// id is the ID of DB the entry
|
||||||
|
// from_jid is the senders jid
|
||||||
|
// to_jid is the receivers jid
|
||||||
|
// from_resource is the senders resource
|
||||||
|
// to_jid is the receivers resource
|
||||||
|
// message is the message text
|
||||||
|
// timestamp the timestamp like "2020/03/24 11:12:14"
|
||||||
|
// type is there to distinguish: message (chat), MUC message (muc), muc pm (mucpm)
|
||||||
|
// stanza_id is the ID from XEP-0359: Unique and Stable Stanza IDs
|
||||||
|
// archive_id is the ID from XEP-0313: Message Archive Management
|
||||||
|
// replace_id is the ID from XEP-0308: Last Message Correction
|
||||||
|
// encryption is to distinguish: none, omemo, otr, pgp
|
||||||
|
// marked_read is 0/1 whether a message has been marked as read via XEP-0333: Chat Markers
|
||||||
|
char *query = "CREATE TABLE IF NOT EXISTS `ChatLogs` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `from_jid` TEXT NOT NULL, `to_jid` TEXT NOT NULL, `from_resource` TEXT, `to_resource` TEXT, `message` TEXT, `timestamp` TEXT, `type` TEXT, `stanza_id` TEXT, `archive_id` TEXT, `replace_id` TEXT, `encryption` TEXT, `marked_read` INTEGER)";
|
||||||
|
if( SQLITE_OK != sqlite3_exec(g_chatlog_database, query, NULL, 0, &err_msg)) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = "CREATE TABLE IF NOT EXISTS `DbVersion` ( `dv_id` INTEGER PRIMARY KEY, `version` INTEGER UNIQUE)";
|
||||||
|
if( SQLITE_OK != sqlite3_exec(g_chatlog_database, query, NULL, 0, &err_msg)) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = "INSERT OR IGNORE INTO `DbVersion` (`version`) VALUES('1')";
|
||||||
|
if( SQLITE_OK != sqlite3_exec(g_chatlog_database, query, NULL, 0, &err_msg)) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug("Initialized SQLite database: %s", filename);
|
||||||
|
free(filename);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (err_msg) {
|
||||||
|
log_error("SQLite error: %s", err_msg);
|
||||||
|
sqlite3_free(err_msg);
|
||||||
|
} else {
|
||||||
|
log_error("Unknown SQLite error");
|
||||||
|
}
|
||||||
|
free(filename);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
log_database_close(void)
|
||||||
|
{
|
||||||
|
if (g_chatlog_database) {
|
||||||
|
sqlite3_close(g_chatlog_database);
|
||||||
|
sqlite3_shutdown();
|
||||||
|
g_chatlog_database = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
log_database_add_incoming(ProfMessage *message)
|
||||||
|
{
|
||||||
|
const char *jid = connection_get_fulljid();
|
||||||
|
Jid *myjid = jid_create(jid);
|
||||||
|
|
||||||
|
_add_to_db(message, NULL, message->jid, myjid);
|
||||||
|
|
||||||
|
jid_destroy(myjid);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_log_database_add_outgoing(char *type, const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc)
|
||||||
|
{
|
||||||
|
ProfMessage *msg = message_init();
|
||||||
|
|
||||||
|
msg->id = id ? strdup(id) : NULL;
|
||||||
|
msg->jid = jid_create(barejid);
|
||||||
|
msg->plain = message ? strdup(message) : NULL;
|
||||||
|
msg->replace_id = replace_id ? strdup(replace_id) : NULL;
|
||||||
|
msg->timestamp = g_date_time_new_now_local(); //TODO: get from outside. best to have whole ProfMessage from outside
|
||||||
|
msg->enc = enc;
|
||||||
|
|
||||||
|
const char *jid = connection_get_fulljid();
|
||||||
|
Jid *myjid = jid_create(jid);
|
||||||
|
|
||||||
|
_add_to_db(msg, type, myjid, msg->jid);
|
||||||
|
|
||||||
|
jid_destroy(myjid);
|
||||||
|
message_free(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
log_database_add_outgoing_chat(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc)
|
||||||
|
{
|
||||||
|
_log_database_add_outgoing("chat", id, barejid, message, replace_id, enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
log_database_add_outgoing_muc(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc)
|
||||||
|
{
|
||||||
|
_log_database_add_outgoing("muc", id, barejid, message, replace_id, enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
log_database_add_outgoing_muc_pm(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc)
|
||||||
|
{
|
||||||
|
_log_database_add_outgoing("mucpm", id, barejid, message, replace_id, enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
GSList*
|
||||||
|
log_database_get_previous_chat(const gchar *const contact_barejid)
|
||||||
|
{
|
||||||
|
sqlite3_stmt *stmt = NULL;
|
||||||
|
char *query;
|
||||||
|
|
||||||
|
if (asprintf(&query, "SELECT * FROM (SELECT `message`, `timestamp`, `from_jid` from `ChatLogs` WHERE `from_jid` = '%s' OR `to_jid` = '%s' ORDER BY `timestamp` DESC LIMIT 10) ORDER BY `timestamp` ASC;", contact_barejid, contact_barejid) == -1) {
|
||||||
|
log_error("log_database_get_previous_chat(): SQL query. could not allocate memory");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rc = sqlite3_prepare_v2(g_chatlog_database, query, -1, &stmt, NULL);
|
||||||
|
if( rc!=SQLITE_OK ) {
|
||||||
|
log_error("log_database_get_previous_chat(): unknown SQLite error");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GSList *history = NULL;
|
||||||
|
|
||||||
|
while( sqlite3_step(stmt) == SQLITE_ROW ) {
|
||||||
|
char *message = (char*)sqlite3_column_text(stmt, 0);
|
||||||
|
char *date = (char*)sqlite3_column_text(stmt, 1);
|
||||||
|
char *from = (char*)sqlite3_column_text(stmt, 2);
|
||||||
|
|
||||||
|
ProfMessage *msg = message_init();
|
||||||
|
msg->jid = jid_create(from);
|
||||||
|
msg->plain = strdup(message);
|
||||||
|
msg->timestamp = g_date_time_new_from_iso8601(date, NULL);
|
||||||
|
// TODO: later we can get more fields like 'enc'. then we can display the history like regular chats with all info the user enabled.
|
||||||
|
|
||||||
|
history = g_slist_append(history, msg);
|
||||||
|
}
|
||||||
|
sqlite3_finalize(stmt);
|
||||||
|
free(query);
|
||||||
|
|
||||||
|
return history;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* _get_message_type_str(prof_msg_type_t type) {
|
||||||
|
switch (type) {
|
||||||
|
case PROF_MSG_TYPE_CHAT:
|
||||||
|
return "chat";
|
||||||
|
case PROF_MSG_TYPE_MUC:
|
||||||
|
return "muc";
|
||||||
|
case PROF_MSG_TYPE_MUCPM:
|
||||||
|
return "mucpm";
|
||||||
|
case PROF_MSG_TYPE_UNINITIALIZED:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* _get_message_enc_str(prof_enc_t enc) {
|
||||||
|
switch (enc) {
|
||||||
|
case PROF_MSG_ENC_PGP:
|
||||||
|
return "pgp";
|
||||||
|
case PROF_MSG_ENC_OTR:
|
||||||
|
return "otr";
|
||||||
|
case PROF_MSG_ENC_OMEMO:
|
||||||
|
return "omemo";
|
||||||
|
case PROF_MSG_ENC_NONE:
|
||||||
|
return "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_add_to_db(ProfMessage *message, char *type, const Jid * const from_jid, const Jid * const to_jid)
|
||||||
|
{
|
||||||
|
if (!g_chatlog_database) {
|
||||||
|
log_debug("log_database_add() called but db is not initialized");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *err_msg;
|
||||||
|
char *query;
|
||||||
|
gchar *date_fmt;
|
||||||
|
|
||||||
|
if (message->timestamp) {
|
||||||
|
date_fmt = g_date_time_format_iso8601(message->timestamp);
|
||||||
|
} else {
|
||||||
|
date_fmt = g_date_time_format_iso8601(g_date_time_new_now_local());
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *enc = _get_message_enc_str(message->enc);
|
||||||
|
|
||||||
|
if (!type) {
|
||||||
|
type = (char*)_get_message_type_str(message->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asprintf(&query, "INSERT INTO `ChatLogs` (`from_jid`, `from_resource`, `to_jid`, `to_resource`, `message`, `timestamp`, `stanza_id`, `replace_id`, `type`, `encryption`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
|
||||||
|
from_jid->barejid,
|
||||||
|
from_jid->resourcepart ? from_jid->resourcepart : "",
|
||||||
|
to_jid->barejid,
|
||||||
|
to_jid->resourcepart ? to_jid->resourcepart : "",
|
||||||
|
message->plain,
|
||||||
|
date_fmt,
|
||||||
|
message->id ? message->id : "",
|
||||||
|
message->replace_id ? message->replace_id : "",
|
||||||
|
type,
|
||||||
|
enc) == -1) {
|
||||||
|
log_error("log_database_add(): SQL query. could not allocate memory");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g_free(date_fmt);
|
||||||
|
|
||||||
|
if( SQLITE_OK != sqlite3_exec(g_chatlog_database, query, NULL, 0, &err_msg)) {
|
||||||
|
if (err_msg) {
|
||||||
|
log_error("SQLite error: %s", err_msg);
|
||||||
|
sqlite3_free(err_msg);
|
||||||
|
} else {
|
||||||
|
log_error("Unknown SQLite error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(query);
|
||||||
|
}
|
52
src/database.h
Normal file
52
src/database.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* database.h
|
||||||
|
* vim: expandtab:ts=4:sts=4:sw=4
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Michael Vetter <jubalh@idoru.org>
|
||||||
|
*
|
||||||
|
* This file is part of Profanity.
|
||||||
|
*
|
||||||
|
* Profanity 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Profanity 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 Profanity. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* In addition, as a special exception, the copyright holders give permission to
|
||||||
|
* link the code of portions of this program with the OpenSSL library under
|
||||||
|
* certain conditions as described in each individual source file, and
|
||||||
|
* distribute linked combinations including the two.
|
||||||
|
*
|
||||||
|
* You must obey the GNU General Public License in all respects for all of the
|
||||||
|
* code used other than OpenSSL. If you modify file(s) with this exception, you
|
||||||
|
* may extend this exception to your version of the file(s), but you are not
|
||||||
|
* obligated to do so. If you do not wish to do so, delete this exception
|
||||||
|
* statement from your version. If you delete this exception statement from all
|
||||||
|
* source files in the program, then also delete it here.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DATABASE_H
|
||||||
|
#define DATABASE_H
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include "config/account.h"
|
||||||
|
#include "xmpp/xmpp.h"
|
||||||
|
|
||||||
|
gboolean log_database_init(ProfAccount *account);
|
||||||
|
void log_database_add_incoming(ProfMessage *message);
|
||||||
|
void log_database_add_outgoing_chat(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc);
|
||||||
|
void log_database_add_outgoing_muc(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc);
|
||||||
|
void log_database_add_outgoing_muc_pm(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc);
|
||||||
|
GSList* log_database_get_previous_chat(const gchar *const contact_barejid);
|
||||||
|
void log_database_close(void);
|
||||||
|
|
||||||
|
#endif // DATABASE_H
|
||||||
|
|
@ -40,6 +40,7 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "database.h"
|
||||||
#include "config/preferences.h"
|
#include "config/preferences.h"
|
||||||
#include "event/common.h"
|
#include "event/common.h"
|
||||||
#include "plugins/plugins.h"
|
#include "plugins/plugins.h"
|
||||||
@ -138,6 +139,7 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (chatwin->pgp_send) {
|
if (chatwin->pgp_send) {
|
||||||
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
||||||
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_PGP);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
@ -145,7 +147,8 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (!handled) {
|
if (!handled) {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -165,7 +168,8 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (!handled) {
|
if (!handled) {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,12 +187,14 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (chatwin->pgp_send) {
|
if (chatwin->pgp_send) {
|
||||||
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
||||||
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_PGP);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,12 +212,14 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (chatwin->is_omemo) {
|
if (chatwin->is_omemo) {
|
||||||
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
||||||
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_OMEMO);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,6 +237,7 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (chatwin->is_omemo) {
|
if (chatwin->is_omemo) {
|
||||||
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
||||||
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_OMEMO);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
@ -236,7 +245,8 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (!handled) {
|
if (!handled) {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -255,17 +265,20 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (chatwin->is_omemo) {
|
if (chatwin->is_omemo) {
|
||||||
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
||||||
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_OMEMO);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else if (chatwin->pgp_send) {
|
} else if (chatwin->pgp_send) {
|
||||||
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
||||||
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_PGP);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,11 +296,13 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (chatwin->is_omemo) {
|
if (chatwin->is_omemo) {
|
||||||
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
char *id = omemo_on_message_send((ProfWin *)chatwin, plugin_msg, request_receipt, FALSE, replace_id);
|
||||||
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_omemo_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_OMEMO);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else if (chatwin->pgp_send) {
|
} else if (chatwin->pgp_send) {
|
||||||
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
char *id = message_send_chat_pgp(chatwin->barejid, plugin_msg, request_receipt, replace_id);
|
||||||
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_pgp_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_PGP);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PGP, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
@ -295,7 +310,8 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
if (!handled) {
|
if (!handled) {
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,7 +329,8 @@ cl_ev_send_msg_correct(ProfChatWin *chatwin, const char *const msg, const char *
|
|||||||
#ifndef HAVE_OMEMO
|
#ifndef HAVE_OMEMO
|
||||||
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
char *id = message_send_chat(chatwin->barejid, plugin_msg, oob_url, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
chat_log_msg_out(chatwin->barejid, plugin_msg, NULL);
|
||||||
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
log_database_add_outgoing_chat(id, chatwin->barejid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
chatwin_outgoing_msg(chatwin, plugin_msg, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
|
|
||||||
plugins_post_chat_message_send(chatwin->barejid, plugin_msg);
|
plugins_post_chat_message_send(chatwin->barejid, plugin_msg);
|
||||||
@ -347,12 +364,14 @@ cl_ev_send_muc_msg_corrected(ProfMucWin *mucwin, const char *const msg, const ch
|
|||||||
if (mucwin->is_omemo) {
|
if (mucwin->is_omemo) {
|
||||||
char *id = omemo_on_message_send((ProfWin *)mucwin, plugin_msg, FALSE, TRUE, replace_id);
|
char *id = omemo_on_message_send((ProfWin *)mucwin, plugin_msg, FALSE, TRUE, replace_id);
|
||||||
groupchat_log_omemo_msg_out(mucwin->roomjid, plugin_msg);
|
groupchat_log_omemo_msg_out(mucwin->roomjid, plugin_msg);
|
||||||
|
log_database_add_outgoing_muc(id, mucwin->roomjid, plugin_msg, replace_id, PROF_MSG_ENC_OMEMO);
|
||||||
mucwin_outgoing_msg(mucwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, replace_id);
|
mucwin_outgoing_msg(mucwin, plugin_msg, id, PROF_MSG_ENC_OMEMO, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
} else {
|
} else {
|
||||||
char *id = message_send_groupchat(mucwin->roomjid, plugin_msg, oob_url, replace_id);
|
char *id = message_send_groupchat(mucwin->roomjid, plugin_msg, oob_url, replace_id);
|
||||||
groupchat_log_msg_out(mucwin->roomjid, plugin_msg);
|
groupchat_log_msg_out(mucwin->roomjid, plugin_msg);
|
||||||
mucwin_outgoing_msg(mucwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, replace_id);
|
log_database_add_outgoing_muc(id, mucwin->roomjid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
mucwin_outgoing_msg(mucwin, plugin_msg, id, PROF_MSG_ENC_NONE, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -364,7 +383,8 @@ cl_ev_send_muc_msg_corrected(ProfMucWin *mucwin, const char *const msg, const ch
|
|||||||
#ifndef HAVE_OMEMO
|
#ifndef HAVE_OMEMO
|
||||||
char *id = message_send_groupchat(mucwin->roomjid, plugin_msg, oob_url, replace_id);
|
char *id = message_send_groupchat(mucwin->roomjid, plugin_msg, oob_url, replace_id);
|
||||||
groupchat_log_msg_out(mucwin->roomjid, plugin_msg);
|
groupchat_log_msg_out(mucwin->roomjid, plugin_msg);
|
||||||
mucwin_outgoing_msg(mucwin, plugin_msg, id, PROF_MSG_ENC_PLAIN, replace_id);
|
log_database_add_outgoing_muc(id, mucwin->roomjid, plugin_msg, replace_id, PROF_MSG_ENC_NONE);
|
||||||
|
mucwin_outgoing_msg(mucwin, plugin_msg, id, PROF_MSG_ENC_NONE, replace_id);
|
||||||
free(id);
|
free(id);
|
||||||
|
|
||||||
plugins_post_room_message_send(mucwin->roomjid, plugin_msg);
|
plugins_post_room_message_send(mucwin->roomjid, plugin_msg);
|
||||||
@ -390,9 +410,11 @@ cl_ev_send_priv_msg(ProfPrivateWin *privwin, const char *const msg, const char *
|
|||||||
char *plugin_msg = plugins_pre_priv_message_send(privwin->fulljid, msg);
|
char *plugin_msg = plugins_pre_priv_message_send(privwin->fulljid, msg);
|
||||||
Jid *jidp = jid_create(privwin->fulljid);
|
Jid *jidp = jid_create(privwin->fulljid);
|
||||||
|
|
||||||
message_send_private(privwin->fulljid, plugin_msg, oob_url);
|
char *id = message_send_private(privwin->fulljid, plugin_msg, oob_url);
|
||||||
chat_log_msg_out(jidp->barejid, plugin_msg, jidp->resourcepart);
|
chat_log_msg_out(jidp->barejid, plugin_msg, jidp->resourcepart);
|
||||||
|
log_database_add_outgoing_muc_pm(id, privwin->fulljid, plugin_msg, NULL, PROF_MSG_ENC_NONE);
|
||||||
privwin_outgoing_msg(privwin, plugin_msg);
|
privwin_outgoing_msg(privwin, plugin_msg);
|
||||||
|
free(id);
|
||||||
|
|
||||||
plugins_post_priv_message_send(privwin->fulljid, plugin_msg);
|
plugins_post_priv_message_send(privwin->fulljid, plugin_msg);
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "xmpp/roster_list.h"
|
#include "xmpp/roster_list.h"
|
||||||
#include "xmpp/muc.h"
|
#include "xmpp/muc.h"
|
||||||
#include "xmpp/xmpp.h"
|
#include "xmpp/xmpp.h"
|
||||||
|
#include "database.h"
|
||||||
|
|
||||||
#ifdef HAVE_LIBGPGME
|
#ifdef HAVE_LIBGPGME
|
||||||
#include "pgp/gpg.h"
|
#include "pgp/gpg.h"
|
||||||
@ -67,6 +68,7 @@ ev_disconnect_cleanup(void)
|
|||||||
#ifdef HAVE_OMEMO
|
#ifdef HAVE_OMEMO
|
||||||
omemo_on_disconnect();
|
omemo_on_disconnect();
|
||||||
#endif
|
#endif
|
||||||
|
log_database_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
|
|
||||||
#include "profanity.h"
|
#include "profanity.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "database.h"
|
||||||
#include "config/preferences.h"
|
#include "config/preferences.h"
|
||||||
#include "config/tlscerts.h"
|
#include "config/tlscerts.h"
|
||||||
#include "config/account.h"
|
#include "config/account.h"
|
||||||
@ -91,6 +92,8 @@ sv_ev_login_account_success(char *account_name, gboolean secured)
|
|||||||
omemo_on_connect(account);
|
omemo_on_connect(account);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
log_database_init(account);
|
||||||
|
|
||||||
avatar_pep_subscribe();
|
avatar_pep_subscribe();
|
||||||
|
|
||||||
ui_handle_login_account_success(account, secured);
|
ui_handle_login_account_success(account, secured);
|
||||||
@ -298,6 +301,7 @@ static void _log_muc(ProfMessage *message)
|
|||||||
} else {
|
} else {
|
||||||
groupchat_log_msg_in(message->jid->barejid, message->jid->resourcepart, message->plain);
|
groupchat_log_msg_in(message->jid->barejid, message->jid->resourcepart, message->plain);
|
||||||
}
|
}
|
||||||
|
log_database_add_incoming(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -397,6 +401,7 @@ sv_ev_incoming_private_message(ProfMessage *message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
_clean_incoming_message(message);
|
_clean_incoming_message(message);
|
||||||
|
log_database_add_incoming(message);
|
||||||
privwin_incoming_msg(privatewin, message);
|
privwin_incoming_msg(privatewin, message);
|
||||||
chat_log_msg_in(message);
|
chat_log_msg_in(message);
|
||||||
|
|
||||||
@ -440,7 +445,7 @@ sv_ev_outgoing_carbon(ProfMessage *message)
|
|||||||
chat_state_active(chatwin->state);
|
chat_state_active(chatwin->state);
|
||||||
|
|
||||||
if (message->plain) {
|
if (message->plain) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
// MUC PM, should have resource (nick) in filename
|
// MUC PM, should have resource (nick) in filename
|
||||||
chat_log_msg_out(message->jid->barejid, message->plain, message->jid->resourcepart);
|
chat_log_msg_out(message->jid->barejid, message->plain, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
@ -460,12 +465,12 @@ sv_ev_outgoing_carbon(ProfMessage *message)
|
|||||||
log_error("Couldn't decrypt GPG message and body was empty");
|
log_error("Couldn't decrypt GPG message and body was empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
}
|
}
|
||||||
@ -478,7 +483,7 @@ sv_ev_outgoing_carbon(ProfMessage *message)
|
|||||||
if (message->enc == PROF_MSG_ENC_OMEMO) {
|
if (message->enc == PROF_MSG_ENC_OMEMO) {
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
} else {
|
} else {
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
}
|
}
|
||||||
@ -500,12 +505,12 @@ sv_ev_outgoing_carbon(ProfMessage *message)
|
|||||||
log_error("Couldn't decrypt GPG message and body was empty");
|
log_error("Couldn't decrypt GPG message and body was empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
}
|
}
|
||||||
@ -516,7 +521,7 @@ sv_ev_outgoing_carbon(ProfMessage *message)
|
|||||||
#ifndef HAVE_LIBGPGME
|
#ifndef HAVE_LIBGPGME
|
||||||
#ifndef HAVE_OMEMO
|
#ifndef HAVE_OMEMO
|
||||||
if (message->body) {
|
if (message->body) {
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
chatwin_outgoing_carbon(chatwin, message);
|
chatwin_outgoing_carbon(chatwin, message);
|
||||||
}
|
}
|
||||||
@ -532,6 +537,7 @@ _sv_ev_incoming_pgp(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
|
|||||||
if (message->plain) {
|
if (message->plain) {
|
||||||
message->enc = PROF_MSG_ENC_PGP;
|
message->enc = PROF_MSG_ENC_PGP;
|
||||||
_clean_incoming_message(message);
|
_clean_incoming_message(message);
|
||||||
|
log_database_add_incoming(message);
|
||||||
chatwin_incoming_msg(chatwin, message, new_win);
|
chatwin_incoming_msg(chatwin, message, new_win);
|
||||||
if (logit) {
|
if (logit) {
|
||||||
chat_log_pgp_msg_in(message);
|
chat_log_pgp_msg_in(message);
|
||||||
@ -544,9 +550,10 @@ _sv_ev_incoming_pgp(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
|
|||||||
log_error("Couldn't decrypt GPG message and body was empty");
|
log_error("Couldn't decrypt GPG message and body was empty");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
_clean_incoming_message(message);
|
_clean_incoming_message(message);
|
||||||
|
log_database_add_incoming(message);
|
||||||
chatwin_incoming_msg(chatwin, message, new_win);
|
chatwin_incoming_msg(chatwin, message, new_win);
|
||||||
chat_log_msg_in(message);
|
chat_log_msg_in(message);
|
||||||
chatwin->pgp_recv = FALSE;
|
chatwin->pgp_recv = FALSE;
|
||||||
@ -565,10 +572,11 @@ _sv_ev_incoming_otr(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
|
|||||||
message->enc = PROF_MSG_ENC_OTR;
|
message->enc = PROF_MSG_ENC_OTR;
|
||||||
chatwin->pgp_send = FALSE;
|
chatwin->pgp_send = FALSE;
|
||||||
} else {
|
} else {
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_clean_incoming_message(message);
|
_clean_incoming_message(message);
|
||||||
|
log_database_add_incoming(message);
|
||||||
chatwin_incoming_msg(chatwin, message, new_win);
|
chatwin_incoming_msg(chatwin, message, new_win);
|
||||||
|
|
||||||
chat_log_otr_msg_in(message);
|
chat_log_otr_msg_in(message);
|
||||||
@ -584,6 +592,7 @@ static void
|
|||||||
_sv_ev_incoming_omemo(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message, gboolean logit)
|
_sv_ev_incoming_omemo(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message, gboolean logit)
|
||||||
{
|
{
|
||||||
_clean_incoming_message(message);
|
_clean_incoming_message(message);
|
||||||
|
log_database_add_incoming(message);
|
||||||
chatwin_incoming_msg(chatwin, message, new_win);
|
chatwin_incoming_msg(chatwin, message, new_win);
|
||||||
if (logit) {
|
if (logit) {
|
||||||
chat_log_omemo_msg_in(message);
|
chat_log_omemo_msg_in(message);
|
||||||
@ -596,9 +605,10 @@ static void
|
|||||||
_sv_ev_incoming_plain(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message, gboolean logit)
|
_sv_ev_incoming_plain(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message, gboolean logit)
|
||||||
{
|
{
|
||||||
if (message->body) {
|
if (message->body) {
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->plain = strdup(message->body);
|
message->plain = strdup(message->body);
|
||||||
_clean_incoming_message(message);
|
_clean_incoming_message(message);
|
||||||
|
log_database_add_incoming(message);
|
||||||
chatwin_incoming_msg(chatwin, message, new_win);
|
chatwin_incoming_msg(chatwin, message, new_win);
|
||||||
if (logit) {
|
if (logit) {
|
||||||
chat_log_msg_in(message);
|
chat_log_msg_in(message);
|
||||||
|
64
src/log.c
64
src/log.c
@ -355,14 +355,14 @@ chat_log_otr_msg_in(ProfMessage *message)
|
|||||||
const char *jid = connection_get_fulljid();
|
const char *jid = connection_get_fulljid();
|
||||||
Jid *jidp = jid_create(jid);
|
Jid *jidp = jid_create(jid);
|
||||||
char *pref_otr_log = prefs_get_string(PREF_OTR_LOG);
|
char *pref_otr_log = prefs_get_string(PREF_OTR_LOG);
|
||||||
if (message->enc == PROF_MSG_ENC_PLAIN || (strcmp(pref_otr_log, "on") == 0)) {
|
if (message->enc == PROF_MSG_ENC_NONE || (strcmp(pref_otr_log, "on") == 0)) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
||||||
}
|
}
|
||||||
} else if (strcmp(pref_otr_log, "redact") == 0) {
|
} else if (strcmp(pref_otr_log, "redact") == 0) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, NULL);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, NULL);
|
||||||
@ -381,13 +381,13 @@ chat_log_pgp_msg_in(ProfMessage *message)
|
|||||||
Jid *jidp = jid_create(jid);
|
Jid *jidp = jid_create(jid);
|
||||||
char *pref_pgp_log = prefs_get_string(PREF_PGP_LOG);
|
char *pref_pgp_log = prefs_get_string(PREF_PGP_LOG);
|
||||||
if (strcmp(pref_pgp_log, "on") == 0) {
|
if (strcmp(pref_pgp_log, "on") == 0) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
||||||
}
|
}
|
||||||
} else if (strcmp(pref_pgp_log, "redact") == 0) {
|
} else if (strcmp(pref_pgp_log, "redact") == 0) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, NULL);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, NULL);
|
||||||
@ -406,13 +406,13 @@ chat_log_omemo_msg_in(ProfMessage *message)
|
|||||||
Jid *jidp = jid_create(jid);
|
Jid *jidp = jid_create(jid);
|
||||||
char *pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
|
char *pref_omemo_log = prefs_get_string(PREF_OMEMO_LOG);
|
||||||
if (strcmp(pref_omemo_log, "on") == 0) {
|
if (strcmp(pref_omemo_log, "on") == 0) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
||||||
}
|
}
|
||||||
} else if (strcmp(pref_omemo_log, "redact") == 0) {
|
} else if (strcmp(pref_omemo_log, "redact") == 0) {
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, "[redacted]", PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
@ -430,7 +430,7 @@ chat_log_msg_in(ProfMessage *message)
|
|||||||
const char *jid = connection_get_fulljid();
|
const char *jid = connection_get_fulljid();
|
||||||
Jid *jidp = jid_create(jid);
|
Jid *jidp = jid_create(jid);
|
||||||
|
|
||||||
if (message->mucuser) {
|
if (message->type == PROF_MSG_TYPE_MUCPM) {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, message->jid->resourcepart);
|
||||||
} else {
|
} else {
|
||||||
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
_chat_log_chat(jidp->barejid, message->jid->barejid, message->plain, PROF_IN_LOG, message->timestamp, NULL);
|
||||||
@ -619,54 +619,6 @@ _groupchat_log_chat(const gchar *const login, const gchar *const room, const gch
|
|||||||
g_date_time_unref(dt);
|
g_date_time_unref(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList*
|
|
||||||
chat_log_get_previous(const gchar *const login, const gchar *const recipient)
|
|
||||||
{
|
|
||||||
GSList *history = NULL;
|
|
||||||
GDateTime *now = g_date_time_new_now_local();
|
|
||||||
GDateTime *log_date = g_date_time_new(tz,
|
|
||||||
g_date_time_get_year(session_started),
|
|
||||||
g_date_time_get_month(session_started),
|
|
||||||
g_date_time_get_day_of_month(session_started),
|
|
||||||
g_date_time_get_hour(session_started),
|
|
||||||
g_date_time_get_minute(session_started),
|
|
||||||
g_date_time_get_second(session_started));
|
|
||||||
|
|
||||||
// get data from all logs from the day the session was started to today
|
|
||||||
while (g_date_time_compare(log_date, now) != 1) {
|
|
||||||
char *filename = _get_log_filename(recipient, login, log_date, FALSE);
|
|
||||||
|
|
||||||
FILE *logp = fopen(filename, "r");
|
|
||||||
if (logp) {
|
|
||||||
GString *header = g_string_new("");
|
|
||||||
g_string_append_printf(header, "%d/%d/%d:",
|
|
||||||
g_date_time_get_day_of_month(log_date),
|
|
||||||
g_date_time_get_month(log_date),
|
|
||||||
g_date_time_get_year(log_date));
|
|
||||||
history = g_slist_append(history, header->str);
|
|
||||||
g_string_free(header, FALSE);
|
|
||||||
|
|
||||||
char *line;
|
|
||||||
while ((line = file_getline(logp)) != NULL) {
|
|
||||||
history = g_slist_append(history, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(logp);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(filename);
|
|
||||||
|
|
||||||
GDateTime *next = g_date_time_add_days(log_date, 1);
|
|
||||||
g_date_time_unref(log_date);
|
|
||||||
log_date = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_date_time_unref(log_date);
|
|
||||||
g_date_time_unref(now);
|
|
||||||
|
|
||||||
return history;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
chat_log_close(void)
|
chat_log_close(void)
|
||||||
{
|
{
|
||||||
|
@ -82,7 +82,6 @@ void chat_log_pgp_msg_in(ProfMessage *message);
|
|||||||
void chat_log_omemo_msg_in(ProfMessage *message);
|
void chat_log_omemo_msg_in(ProfMessage *message);
|
||||||
|
|
||||||
void chat_log_close(void);
|
void chat_log_close(void);
|
||||||
GSList* chat_log_get_previous(const gchar *const login, const gchar *const recipient);
|
|
||||||
|
|
||||||
void groupchat_log_init(void);
|
void groupchat_log_init(void);
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "database.h"
|
||||||
#include "config/preferences.h"
|
#include "config/preferences.h"
|
||||||
#include "config/files.h"
|
#include "config/files.h"
|
||||||
#include "otr/otr.h"
|
#include "otr/otr.h"
|
||||||
@ -348,6 +349,7 @@ otr_on_message_send(ProfChatWin *chatwin, const char *const message, gboolean re
|
|||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
id = message_send_chat_otr(chatwin->barejid, encrypted, request_receipt, replace_id);
|
id = message_send_chat_otr(chatwin->barejid, encrypted, request_receipt, replace_id);
|
||||||
chat_log_otr_msg_out(chatwin->barejid, message, NULL);
|
chat_log_otr_msg_out(chatwin->barejid, message, NULL);
|
||||||
|
log_database_add_outgoing_chat(id, chatwin->barejid, message, replace_id, PROF_MSG_ENC_OTR);
|
||||||
chatwin_outgoing_msg(chatwin, message, id, PROF_MSG_ENC_OTR, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, message, id, PROF_MSG_ENC_OTR, request_receipt, replace_id);
|
||||||
otr_free_message(encrypted);
|
otr_free_message(encrypted);
|
||||||
free(id);
|
free(id);
|
||||||
@ -368,7 +370,7 @@ otr_on_message_send(ProfChatWin *chatwin, const char *const message, gboolean re
|
|||||||
if (policy == PROF_OTRPOLICY_OPPORTUNISTIC) {
|
if (policy == PROF_OTRPOLICY_OPPORTUNISTIC) {
|
||||||
char *otr_tagged_msg = otr_tag_message(message);
|
char *otr_tagged_msg = otr_tag_message(message);
|
||||||
id = message_send_chat_otr(chatwin->barejid, otr_tagged_msg, request_receipt, replace_id);
|
id = message_send_chat_otr(chatwin->barejid, otr_tagged_msg, request_receipt, replace_id);
|
||||||
chatwin_outgoing_msg(chatwin, message, id, PROF_MSG_ENC_PLAIN, request_receipt, replace_id);
|
chatwin_outgoing_msg(chatwin, message, id, PROF_MSG_ENC_NONE, request_receipt, replace_id);
|
||||||
chat_log_msg_out(chatwin->barejid, message, NULL);
|
chat_log_msg_out(chatwin->barejid, message, NULL);
|
||||||
free(otr_tagged_msg);
|
free(otr_tagged_msg);
|
||||||
free(id);
|
free(id);
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "window_list.h"
|
#include "window_list.h"
|
||||||
#include "xmpp/roster_list.h"
|
#include "xmpp/roster_list.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "database.h"
|
||||||
#include "config/preferences.h"
|
#include "config/preferences.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
#include "ui/window.h"
|
#include "ui/window.h"
|
||||||
@ -56,7 +57,7 @@
|
|||||||
#include "omemo/omemo.h"
|
#include "omemo/omemo.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void _chatwin_history(ProfChatWin *chatwin, const char *const contact);
|
static void _chatwin_history(ProfChatWin *chatwin, const char *const contact_barejid);
|
||||||
static void _chatwin_set_last_message(ProfChatWin *chatwin, const char *const id, const char *const message);
|
static void _chatwin_set_last_message(ProfChatWin *chatwin, const char *const id, const char *const message);
|
||||||
|
|
||||||
ProfChatWin*
|
ProfChatWin*
|
||||||
@ -477,38 +478,20 @@ chatwin_unset_outgoing_char(ProfChatWin *chatwin)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_chatwin_history(ProfChatWin *chatwin, const char *const contact)
|
_chatwin_history(ProfChatWin *chatwin, const char *const contact_barejid)
|
||||||
{
|
{
|
||||||
if (!chatwin->history_shown) {
|
if (!chatwin->history_shown) {
|
||||||
Jid *jid = jid_create(connection_get_fulljid());
|
GSList *history = log_database_get_previous_chat(contact_barejid);
|
||||||
GSList *history = chat_log_get_previous(jid->barejid, contact);
|
|
||||||
jid_destroy(jid);
|
|
||||||
GSList *curr = history;
|
GSList *curr = history;
|
||||||
int idd = 0;
|
|
||||||
int imo = 0;
|
|
||||||
int iyy = 0;
|
|
||||||
|
|
||||||
while (curr) {
|
while (curr) {
|
||||||
char *line = curr->data;
|
ProfMessage *msg = curr->data;
|
||||||
// entry, containing the actual entries with date followed by text
|
win_print_history((ProfWin*)chatwin, msg, FALSE);
|
||||||
if (line[2] == ':') {
|
|
||||||
char hh[3]; memcpy(hh, &line[0], 2); hh[2] = '\0'; int ihh = atoi(hh);
|
|
||||||
char mm[3]; memcpy(mm, &line[3], 2); mm[2] = '\0'; int imm = atoi(mm);
|
|
||||||
char ss[3]; memcpy(ss, &line[6], 2); ss[2] = '\0'; int iss = atoi(ss);
|
|
||||||
GDateTime *timestamp = g_date_time_new_local(iyy, imo, idd, ihh, imm, iss);
|
|
||||||
win_print_history((ProfWin*)chatwin, timestamp, curr->data+11);
|
|
||||||
g_date_time_unref(timestamp);
|
|
||||||
// header, containing the date from filename "21/10/2019:"
|
|
||||||
} else {
|
|
||||||
char dd[3]; memcpy(dd, &line[0], 2); dd[2] = '\0'; idd = atoi(dd);
|
|
||||||
char mm[3]; memcpy(mm, &line[3], 2); mm[2] = '\0'; imo = atoi(mm);
|
|
||||||
char yy[5]; memcpy(yy, &line[6], 4); yy[4] = '\0'; iyy = atoi(yy);
|
|
||||||
}
|
|
||||||
curr = g_slist_next(curr);
|
curr = g_slist_next(curr);
|
||||||
}
|
}
|
||||||
chatwin->history_shown = TRUE;
|
chatwin->history_shown = TRUE;
|
||||||
|
|
||||||
g_slist_free_full(history, free);
|
g_slist_free_full(history, (GDestroyNotify)message_free);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,22 +373,7 @@ mucwin_history(ProfMucWin *mucwin, const ProfMessage *const message)
|
|||||||
char *muc_history_color = prefs_get_string(PREF_HISTORY_COLOR_MUC);
|
char *muc_history_color = prefs_get_string(PREF_HISTORY_COLOR_MUC);
|
||||||
|
|
||||||
if (g_strcmp0(muc_history_color, "unanimous") == 0) {
|
if (g_strcmp0(muc_history_color, "unanimous") == 0) {
|
||||||
GString *line = g_string_new("");
|
win_print_history(window, message, TRUE);
|
||||||
|
|
||||||
if (strncmp(message->plain, "/me ", 4) == 0) {
|
|
||||||
g_string_append(line, "*");
|
|
||||||
g_string_append(line, nick);
|
|
||||||
g_string_append(line, " ");
|
|
||||||
g_string_append(line, message->plain + 4);
|
|
||||||
} else {
|
|
||||||
g_string_append(line, nick);
|
|
||||||
g_string_append(line, ": ");
|
|
||||||
g_string_append(line, message->plain);
|
|
||||||
}
|
|
||||||
|
|
||||||
win_print_history(window, message->timestamp, line->str);
|
|
||||||
|
|
||||||
g_string_free(line, TRUE);
|
|
||||||
} else {
|
} else {
|
||||||
char *mynick = muc_nick(mucwin->roomjid);
|
char *mynick = muc_nick(mucwin->roomjid);
|
||||||
GSList *mentions = get_mentions(prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD), prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE), message->plain, mynick);
|
GSList *mentions = get_mentions(prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD), prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE), message->plain, mynick);
|
||||||
|
@ -1218,15 +1218,41 @@ win_print_outgoing(ProfWin *window, const char *show_char, const char *const id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
win_print_history(ProfWin *window, GDateTime *timestamp, const char *const message)
|
win_print_history(ProfWin *window, const ProfMessage *const message, gboolean is_muc)
|
||||||
{
|
{
|
||||||
g_date_time_ref(timestamp);
|
g_date_time_ref(message->timestamp);
|
||||||
|
|
||||||
buffer_append(window->layout->buffer, "-", 0, timestamp, 0, THEME_TEXT_HISTORY, "", NULL, message, NULL, NULL);
|
int flags = 0;
|
||||||
_win_print_internal(window, "-", 0, timestamp, 0, THEME_TEXT_HISTORY, "", message, NULL);
|
|
||||||
|
// TODO: ProfMessage needs a 'type' field like we have in sql db. then we can know whether each message is a chat, muc, mucpm
|
||||||
|
char *display_name;
|
||||||
|
if (is_muc) {
|
||||||
|
display_name = strdup(message->jid->resourcepart);
|
||||||
|
|
||||||
|
char *muc_history_color = prefs_get_string(PREF_HISTORY_COLOR_MUC);
|
||||||
|
if (g_strcmp0(muc_history_color, "unanimous") == 0) {
|
||||||
|
flags = NO_COLOUR_FROM;
|
||||||
|
}
|
||||||
|
g_free(muc_history_color);
|
||||||
|
} else {
|
||||||
|
const char *jid = connection_get_fulljid();
|
||||||
|
Jid *jidp = jid_create(jid);
|
||||||
|
|
||||||
|
if (g_strcmp0(jidp->barejid, message->jid->barejid) == 0) {
|
||||||
|
display_name = strdup("me");
|
||||||
|
} else {
|
||||||
|
display_name = roster_get_msg_display_name(message->jid->barejid, message->jid->resourcepart);
|
||||||
|
}
|
||||||
|
jid_destroy(jidp);
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer_append(window->layout->buffer, "-", 0, message->timestamp, flags, THEME_TEXT_HISTORY, display_name, NULL, message->plain, NULL, NULL);
|
||||||
|
_win_print_internal(window, "-", 0, message->timestamp, flags, THEME_TEXT_HISTORY, display_name, message->plain, NULL);
|
||||||
|
|
||||||
|
free(display_name);
|
||||||
|
|
||||||
inp_nonblocking(TRUE);
|
inp_nonblocking(TRUE);
|
||||||
g_date_time_unref(timestamp);
|
g_date_time_unref(message->timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -68,7 +68,7 @@ void win_print_outgoing(ProfWin *window, const char *show_char, const char *cons
|
|||||||
void win_print_outgoing_with_receipt(ProfWin *window, const char *show_char, const char *const from, const char *const message, char *id, const char *const replace_id);
|
void win_print_outgoing_with_receipt(ProfWin *window, const char *show_char, const char *const from, const char *const message, char *id, const char *const replace_id);
|
||||||
void win_println_incoming_muc_msg(ProfWin *window, char *show_char, int flags, const ProfMessage *const message);
|
void win_println_incoming_muc_msg(ProfWin *window, char *show_char, int flags, const ProfMessage *const message);
|
||||||
void win_print_outgoing_muc_msg(ProfWin *window, char *show_char, const char *const me, const char *const id, const char *const replace_id, const char *const message);
|
void win_print_outgoing_muc_msg(ProfWin *window, char *show_char, const char *const me, const char *const id, const char *const replace_id, const char *const message);
|
||||||
void win_print_history(ProfWin *window, GDateTime *timestamp, const char *const message);
|
void win_print_history(ProfWin *window, const ProfMessage *const message, gboolean is_muc);
|
||||||
|
|
||||||
void win_print_http_upload(ProfWin *window, const char *const message, char *url);
|
void win_print_http_upload(ProfWin *window, const char *const message, char *url);
|
||||||
|
|
||||||
|
@ -110,6 +110,7 @@ _message_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *con
|
|||||||
_handle_error(stanza);
|
_handle_error(stanza);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if muc
|
||||||
if (g_strcmp0(type, STANZA_TYPE_GROUPCHAT) == 0) {
|
if (g_strcmp0(type, STANZA_TYPE_GROUPCHAT) == 0) {
|
||||||
_handle_groupchat(stanza);
|
_handle_groupchat(stanza);
|
||||||
}
|
}
|
||||||
@ -192,10 +193,10 @@ message_init(void)
|
|||||||
message->body = NULL;
|
message->body = NULL;
|
||||||
message->encrypted = NULL;
|
message->encrypted = NULL;
|
||||||
message->plain = NULL;
|
message->plain = NULL;
|
||||||
message->enc = PROF_MSG_ENC_PLAIN;
|
message->enc = PROF_MSG_ENC_NONE;
|
||||||
message->timestamp = NULL;
|
message->timestamp = NULL;
|
||||||
message->trusted = true;
|
message->trusted = true;
|
||||||
message->mucuser = false;
|
message->type = PROF_MSG_TYPE_UNINITIALIZED;
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
@ -508,7 +509,7 @@ message_send_chat_omemo(const char *const jid, uint32_t sid, GList *keys,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
char*
|
||||||
message_send_private(const char *const fulljid, const char *const msg, const char *const oob_url)
|
message_send_private(const char *const fulljid, const char *const msg, const char *const oob_url)
|
||||||
{
|
{
|
||||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||||
@ -517,14 +518,14 @@ message_send_private(const char *const fulljid, const char *const msg, const cha
|
|||||||
xmpp_stanza_t *message = xmpp_message_new(ctx, STANZA_TYPE_CHAT, fulljid, id);
|
xmpp_stanza_t *message = xmpp_message_new(ctx, STANZA_TYPE_CHAT, fulljid, id);
|
||||||
xmpp_message_set_body(message, msg);
|
xmpp_message_set_body(message, msg);
|
||||||
|
|
||||||
free(id);
|
|
||||||
|
|
||||||
if (oob_url) {
|
if (oob_url) {
|
||||||
stanza_attach_x_oob_url(ctx, message, oob_url);
|
stanza_attach_x_oob_url(ctx, message, oob_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
_send_message_stanza(message);
|
_send_message_stanza(message);
|
||||||
xmpp_stanza_release(message);
|
xmpp_stanza_release(message);
|
||||||
|
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
@ -831,6 +832,7 @@ _handle_groupchat(xmpp_stanza_t *const stanza)
|
|||||||
|
|
||||||
ProfMessage *message = message_init();
|
ProfMessage *message = message_init();
|
||||||
message->jid = jid;
|
message->jid = jid;
|
||||||
|
message->type = PROF_MSG_TYPE_MUC;
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
message->id = strdup(id);
|
message->id = strdup(id);
|
||||||
@ -977,7 +979,7 @@ _handle_muc_private_message(xmpp_stanza_t *const stanza)
|
|||||||
{
|
{
|
||||||
// standard chat message, use jid without resource
|
// standard chat message, use jid without resource
|
||||||
ProfMessage *message = message_init();
|
ProfMessage *message = message_init();
|
||||||
message->mucuser = TRUE;
|
message->type = PROF_MSG_TYPE_MUCPM;
|
||||||
|
|
||||||
const gchar *from = xmpp_stanza_get_from(stanza);
|
const gchar *from = xmpp_stanza_get_from(stanza);
|
||||||
message->jid = jid_create(from);
|
message->jid = jid_create(from);
|
||||||
@ -1009,6 +1011,8 @@ _handle_muc_private_message(xmpp_stanza_t *const stanza)
|
|||||||
if (message->timestamp) {
|
if (message->timestamp) {
|
||||||
sv_ev_delayed_private_message(message);
|
sv_ev_delayed_private_message(message);
|
||||||
} else {
|
} else {
|
||||||
|
message->timestamp = g_date_time_new_now_local();
|
||||||
|
|
||||||
sv_ev_incoming_private_message(message);
|
sv_ev_incoming_private_message(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,11 +1064,12 @@ _handle_carbons(xmpp_stanza_t *const stanza)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ProfMessage *message = message_init();
|
ProfMessage *message = message_init();
|
||||||
|
message->type = PROF_MSG_TYPE_CHAT;
|
||||||
|
|
||||||
// check whether message was a MUC PM
|
// check whether message was a MUC PM
|
||||||
xmpp_stanza_t *mucuser = xmpp_stanza_get_child_by_ns(message_stanza, STANZA_NS_MUC_USER);
|
xmpp_stanza_t *mucuser = xmpp_stanza_get_child_by_ns(message_stanza, STANZA_NS_MUC_USER);
|
||||||
if (mucuser) {
|
if (mucuser) {
|
||||||
message->mucuser = TRUE;
|
message->type = PROF_MSG_TYPE_MUCPM;
|
||||||
}
|
}
|
||||||
|
|
||||||
// id
|
// id
|
||||||
@ -1179,6 +1184,7 @@ _handle_chat(xmpp_stanza_t *const stanza)
|
|||||||
// standard chat message, use jid without resource
|
// standard chat message, use jid without resource
|
||||||
ProfMessage *message = message_init();
|
ProfMessage *message = message_init();
|
||||||
message->jid = jid;
|
message->jid = jid;
|
||||||
|
message->type = PROF_MSG_TYPE_CHAT;
|
||||||
|
|
||||||
// message stanza id
|
// message stanza id
|
||||||
const char *id = xmpp_stanza_get_id(stanza);
|
const char *id = xmpp_stanza_get_id(stanza);
|
||||||
@ -1195,10 +1201,14 @@ _handle_chat(xmpp_stanza_t *const stanza)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mucuser) {
|
if (mucuser) {
|
||||||
message->mucuser = TRUE;
|
message->type = PROF_MSG_TYPE_MUCPM;
|
||||||
}
|
}
|
||||||
|
|
||||||
message->timestamp = stanza_get_delay(stanza);
|
message->timestamp = stanza_get_delay(stanza);
|
||||||
|
if (!message->timestamp) {
|
||||||
|
message->timestamp = g_date_time_new_now_local();
|
||||||
|
}
|
||||||
|
|
||||||
if (body) {
|
if (body) {
|
||||||
message->body = xmpp_stanza_get_text(body);
|
message->body = xmpp_stanza_get_text(body);
|
||||||
}
|
}
|
||||||
|
@ -120,19 +120,31 @@ typedef struct disco_item_t {
|
|||||||
} DiscoItem;
|
} DiscoItem;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PROF_MSG_ENC_PLAIN,
|
PROF_MSG_ENC_NONE,
|
||||||
PROF_MSG_ENC_OTR,
|
PROF_MSG_ENC_OTR,
|
||||||
PROF_MSG_ENC_PGP,
|
PROF_MSG_ENC_PGP,
|
||||||
PROF_MSG_ENC_OMEMO
|
PROF_MSG_ENC_OMEMO
|
||||||
} prof_enc_t;
|
} prof_enc_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PROF_MSG_TYPE_UNINITIALIZED,
|
||||||
|
// regular 1:1 chat
|
||||||
|
PROF_MSG_TYPE_CHAT,
|
||||||
|
// groupchats to whole group
|
||||||
|
PROF_MSG_TYPE_MUC,
|
||||||
|
// groupchat private message
|
||||||
|
PROF_MSG_TYPE_MUCPM
|
||||||
|
} prof_msg_type_t;
|
||||||
|
|
||||||
typedef struct prof_message_t {
|
typedef struct prof_message_t {
|
||||||
Jid *jid;
|
Jid *jid;
|
||||||
|
/* regular <message id=""> */
|
||||||
char *id;
|
char *id;
|
||||||
/* </origin-id> XEP-0359 */
|
/* </origin-id> XEP-0359 */
|
||||||
char *originid;
|
char *originid;
|
||||||
/* <replace id> XEP-0308 LMC */
|
/* <replace id> XEP-0308 LMC */
|
||||||
char *replace_id;
|
char *replace_id;
|
||||||
|
/* for MAM we will need archive_id (also XEP-0359) (see database.c)
|
||||||
/* The raw body from xmpp message, either plaintext or OTR encrypted text */
|
/* The raw body from xmpp message, either plaintext or OTR encrypted text */
|
||||||
char *body;
|
char *body;
|
||||||
/* The encrypted message as for PGP */
|
/* The encrypted message as for PGP */
|
||||||
@ -142,7 +154,7 @@ typedef struct prof_message_t {
|
|||||||
GDateTime *timestamp;
|
GDateTime *timestamp;
|
||||||
prof_enc_t enc;
|
prof_enc_t enc;
|
||||||
gboolean trusted;
|
gboolean trusted;
|
||||||
gboolean mucuser;
|
prof_msg_type_t type;
|
||||||
} ProfMessage;
|
} ProfMessage;
|
||||||
|
|
||||||
void session_init(void);
|
void session_init(void);
|
||||||
@ -175,7 +187,7 @@ char* message_send_chat(const char *const barejid, const char *const msg, const
|
|||||||
char* message_send_chat_otr(const char *const barejid, const char *const msg, gboolean request_receipt, const char *const replace_id);
|
char* message_send_chat_otr(const char *const barejid, const char *const msg, gboolean request_receipt, const char *const replace_id);
|
||||||
char* message_send_chat_pgp(const char *const barejid, const char *const msg, gboolean request_receipt, const char *const replace_id);
|
char* message_send_chat_pgp(const char *const barejid, const char *const msg, gboolean request_receipt, const char *const replace_id);
|
||||||
char* message_send_chat_omemo(const char *const jid, uint32_t sid, GList *keys, const unsigned char *const iv, size_t iv_len, const unsigned char *const ciphertext, size_t ciphertext_len, gboolean request_receipt, gboolean muc, const char *const replace_id);
|
char* message_send_chat_omemo(const char *const jid, uint32_t sid, GList *keys, const unsigned char *const iv, size_t iv_len, const unsigned char *const ciphertext, size_t ciphertext_len, gboolean request_receipt, gboolean muc, const char *const replace_id);
|
||||||
void message_send_private(const char *const fulljid, const char *const msg, const char *const oob_url);
|
char* message_send_private(const char *const fulljid, const char *const msg, const char *const oob_url);
|
||||||
char* message_send_groupchat(const char *const roomjid, const char *const msg, const char *const oob_url, const char *const replace_id);
|
char* message_send_groupchat(const char *const roomjid, const char *const msg, const char *const oob_url, const char *const replace_id);
|
||||||
void message_send_groupchat_subject(const char *const roomjid, const char *const subject);
|
void message_send_groupchat_subject(const char *const roomjid, const char *const subject);
|
||||||
void message_send_inactive(const char *const jid);
|
void message_send_inactive(const char *const jid);
|
||||||
|
36
tests/unittests/database/stub_database.c
Normal file
36
tests/unittests/database/stub_database.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* stub_database.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Michael Vetter <jubalh@iodoru.org>
|
||||||
|
*
|
||||||
|
* This file is part of Profanity.
|
||||||
|
*
|
||||||
|
* Profanity 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 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Profanity 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 Profanity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <cmocka.h>
|
||||||
|
|
||||||
|
#include "database.h"
|
||||||
|
|
||||||
|
gboolean log_database_init(ProfAccount *account) { return TRUE; }
|
||||||
|
void log_database_add_incoming_chat(ProfMessage *message) {}
|
||||||
|
void log_database_add_incoming_muc(ProfMessage *message) {}
|
||||||
|
void log_database_add_incoming_muc_pm(ProfMessage *message) {}
|
||||||
|
void log_database_add_outgoing_chat(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc) {}
|
||||||
|
void log_database_add_outgoing_muc(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc) {}
|
||||||
|
void log_database_add_outgoing_muc_pm(const char * const id, const char * const barejid, const char * const message, const char *const replace_id, prof_enc_t enc) {}
|
||||||
|
void log_database_close(void) {}
|
@ -67,11 +67,6 @@ void chat_log_pgp_msg_in(ProfMessage *message) {}
|
|||||||
void chat_log_omemo_msg_in(ProfMessage *message) {}
|
void chat_log_omemo_msg_in(ProfMessage *message) {}
|
||||||
|
|
||||||
void chat_log_close(void) {}
|
void chat_log_close(void) {}
|
||||||
GSList * chat_log_get_previous(const gchar * const login,
|
|
||||||
const gchar * const recipient)
|
|
||||||
{
|
|
||||||
return mock_ptr_type(GSList *);
|
|
||||||
}
|
|
||||||
|
|
||||||
void groupchat_log_init(void) {}
|
void groupchat_log_init(void) {}
|
||||||
void groupchat_log_msg_in(const gchar *const room, const gchar *const nick, const gchar *const msg) {}
|
void groupchat_log_msg_in(const gchar *const room, const gchar *const nick, const gchar *const msg) {}
|
||||||
|
@ -116,11 +116,16 @@ char* message_send_chat_pgp(const char * const barejid, const char * const msg,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void message_send_private(const char * const fulljid, const char * const msg, const char *const oob_url) {}
|
char* message_send_private(const char *const fulljid, const char *const msg, const char *const oob_url)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
char* message_send_groupchat(const char *const roomjid, const char *const msg, const char *const oob_url, const char *const replace_id)
|
char* message_send_groupchat(const char *const roomjid, const char *const msg, const char *const oob_url, const char *const replace_id)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void message_send_groupchat_subject(const char * const roomjid, const char * const subject) {}
|
void message_send_groupchat_subject(const char * const roomjid, const char * const subject) {}
|
||||||
|
|
||||||
void message_send_inactive(const char * const barejid) {}
|
void message_send_inactive(const char * const barejid) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user