Skip to content
Commits on Source (59)
......@@ -83,11 +83,16 @@ appimage:build:
artifacts:
name: "Remmina-x86_64.AppImage"
expose_as: "Download AppImage"
paths:
- $BUILD_FOLDER/Remmina-x86_64.AppImage
expire_in: 7 days
only:
refs:
- web
- merge_requests
- tags
- web
- schedules
flatpak:test:
image: remmina/ubuntu:18.04
......@@ -108,7 +113,7 @@ flatpak:test:
expose_as: "Download flatpak from the flatpak artifact folder"
paths:
- flatpak/$BUNDLE
expire_in: 10 days
expire_in: 7 days
cache:
paths:
- flatpak/.flatpak-builder/cache
......
# Changelog
## v1.4.7
[full changelog](https://gitlab.com/Remmina/Remmina/compare/v1.4.6...v1.4.7)
* Allow compilation with libwinpr (freerdp) pre commit 8c5d96784d [!2083](https://gitlab.com/Remmina/Remmina/merge_requests/2083) *@giox069*
* Bug fixing v1.4.6 [!2082](https://gitlab.com/Remmina/Remmina/merge_requests/2082) *@antenore*
* Spelling: Automatic negotiation [!2084](https://gitlab.com/Remmina/Remmina/merge_requests/2084) *@kingu*
* Spelling: GNOME Shell, opt-in desc, comments [!2085](https://gitlab.com/Remmina/Remmina/merge_requests/2085) *@kingu*
* Memory leaks fixes [!2086](https://gitlab.com/Remmina/Remmina/merge_requests/2086) *@antenore*
* RDP: Replacing deprecated freerdp function VeryfyCertificate [!2087](https://gitlab.com/Remmina/Remmina/merge_requests/2087) *@antenore*
## v1.4.6
[full changelog](https://gitlab.com/Remmina/Remmina/compare/v1.4.5...v1.4.6)
......
......@@ -212,7 +212,7 @@ endif()
set(WITH_LIBRARY_VERSIONING "ON")
set(REMMINA_VERSION_MAJOR "1")
set(REMMINA_VERSION_MINOR "4")
set(REMMINA_VERSION_REVISION "6")
set(REMMINA_VERSION_REVISION "7")
#set(REMMINA_VERSION_SUFFIX "1")
#set(REMMINA_VERSION "${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}.${REMMINA_VERSION_SUFFIX}")
set(REMMINA_VERSION "${REMMINA_VERSION_MAJOR}.${REMMINA_VERSION_MINOR}.${REMMINA_VERSION_REVISION}")
......
......@@ -38,7 +38,7 @@ PROJECT_NAME = "Remmina - The GTK+ Remote Desktop Client"
# could be handy for archiving the generated documentation or if some version
# control system is used.
PROJECT_NUMBER = v1.4.6
PROJECT_NUMBER = v1.4.7
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
......
......@@ -3,12 +3,12 @@
.Os
.Sh NAME
.Nm gnome-session-remmina
.Nd Gnome Shell session script for Remmina
.Nd GNOME Shell session script for Remmina
.Sh DESCRIPTION
.Nm
This script is part of the Remmina kiosk mode.
If you have a freedesktop compliant Login Manager, a Remmina Kiosk mode will be
added in the list of the available sessions.
If you have a freedesktop compliant Login Manager, a Remmina kiosk mode will be
added in the list of available sessions.
.Sh SEE ALSO
.Xr remmina 1
.Sh AUTHORS
......
......@@ -16,7 +16,7 @@
<summary xml:lang="fr">Client de contrôle de bureau à distance</summary>
<content_rating type="oars-1.1" />
<releases>
<release version="1.4.6" date="2020-06-09"/>
<release version="1.4.7" date="2020-06-19"/>
</releases>
<description>
<p>
......
......@@ -3,19 +3,19 @@
.Os
.Sh NAME
.Nm remmina-gnome
.Nd Script file to start common Gnome Shell interfaces
.Nd Script file to start common GNOME Shell interfaces
.Sh DESCRIPTION
.Nm
This script is part of the Remmina kiosk mode.
If you have a freedesktop compliant Login Manager, a Remmina Kiosk mode will be
added in the list of the available sessions.
If you have a freedesktop compliant Login Manager, a Remmina kiosk mode will be
added in the list of available sessions.
.Sh USAGE
Ports from the range 5901-5999 map directly to VNC displays numbered 1-99.
Ports from the 5901-5999 range map directly to VNC displays numbered 1-99.
For example, to connect to server at 192.168.0.1 to the screen :1, in the
address field we simply write the IP address 192.168.0.1.
For example, to connect to server at 192.168.0.1 to the screen :1,
write the IP address 192.168.0.1 in the address field.
To connect to display number :2 we may refer to the display number by writing
To connect to display number :2, refer to the display number by writing
the address as 192.168.0.1:2. Another way is to refer to the port by specifying
the address as 192.168.0.1:5902.
.Sh SEE ALSO
......
......@@ -35,9 +35,9 @@
<script type="text/javascript">
new Chartkick.BarChart(
"multiple-bar-stacked", [
{ name: "Translated", data: [["ar.po",230],["ast.po",163],["bg.po",243],["bn.po",12],["br.po",0],["bs.po",163],["ca.po",671],["ca@valencia.po",671],["cs.po",686],["da.po",684],["de.po",686],["el.po",186],["en_AU.po",666],["en_GB.po",666],["eo.po",0],["es.po",681],["es_VE.po",284],["et.po",102],["eu.po",240],["fa.po",86],["fi.po",661],["fr.po",686],["gl.po",172],["he.po",686],["hi.po",0],["hr.po",686],["hu.po",665],["id.po",680],["ie.po",269],["it.po",686],["ja.po",676],["kk.po",53],["km.po",55],["kn.po",11],["ko.po",581],["lt.po",163],["lv.po",163],["mr.po",15],["ms.po",165],["my.po",13],["nb.po",498],["nl.po",339],["oc.po",164],["pl.po",686],["pt.po",318],["pt_BR.po",686],["pt_PT.po",262],["ro.po",170],["ru.po",681],["shn.po",0],["si.po",36],["sk.po",594],["sl.po",165],["sq.po",86],["sr.po",114],["sv.po",307],["te.po",14],["th.po",89],["tr.po",686],["ug.po",160],["uk.po",686],["uz@cyrillic.po",245],["zh_CN.po",560],["zh_TW.po",452]] },
{ name: "Fuzzy", data: [["ar.po",19],["ast.po",120],["bg.po",91],["bn.po",12],["br.po",0],["bs.po",120],["ca.po",10],["ca@valencia.po",10],["cs.po",0],["da.po",1],["de.po",0],["el.po",121],["en_AU.po",10],["en_GB.po",10],["eo.po",0],["es.po",1],["es_VE.po",190],["et.po",61],["eu.po",4],["fa.po",9],["fi.po",13],["fr.po",0],["gl.po",120],["he.po",0],["hi.po",0],["hr.po",0],["hu.po",10],["id.po",1],["ie.po",117],["it.po",0],["ja.po",0],["kk.po",81],["km.po",37],["kn.po",4],["ko.po",63],["lt.po",120],["lv.po",120],["mr.po",4],["ms.po",120],["my.po",12],["nb.po",187],["nl.po",73],["oc.po",119],["pl.po",0],["pt.po",79],["pt_BR.po",0],["pt_PT.po",104],["ro.po",120],["ru.po",1],["shn.po",0],["si.po",17],["sk.po",51],["sl.po",120],["sq.po",50],["sr.po",93],["sv.po",358],["te.po",3],["th.po",93],["tr.po",0],["ug.po",123],["uk.po",0],["uz@cyrillic.po",144],["zh_CN.po",76],["zh_TW.po",169]] },
{ name: "Untranslated", data: [["ar.po",437],["ast.po",403],["bg.po",352],["bn.po",662],["br.po",686],["bs.po",403],["ca.po",5],["ca@valencia.po",5],["cs.po",0],["da.po",1],["de.po",0],["el.po",379],["en_AU.po",10],["en_GB.po",10],["eo.po",686],["es.po",4],["es_VE.po",212],["et.po",523],["eu.po",442],["fa.po",591],["fi.po",12],["fr.po",0],["gl.po",394],["he.po",0],["hi.po",686],["hr.po",0],["hu.po",11],["id.po",5],["ie.po",300],["it.po",0],["ja.po",10],["kk.po",552],["km.po",594],["kn.po",671],["ko.po",42],["lt.po",403],["lv.po",403],["mr.po",667],["ms.po",401],["my.po",661],["nb.po",1],["nl.po",274],["oc.po",403],["pl.po",0],["pt.po",289],["pt_BR.po",0],["pt_PT.po",320],["ro.po",396],["ru.po",4],["shn.po",686],["si.po",633],["sk.po",41],["sl.po",401],["sq.po",550],["sr.po",479],["sv.po",21],["te.po",669],["th.po",504],["tr.po",0],["ug.po",403],["uk.po",0],["uz@cyrillic.po",297],["zh_CN.po",50],["zh_TW.po",65]] }
{ name: "Translated", data: [["ar.po",230],["ast.po",163],["bg.po",243],["bn.po",12],["br.po",0],["bs.po",163],["ca.po",670],["ca@valencia.po",670],["ckb.po",0],["cs.po",685],["da.po",686],["de.po",686],["el.po",186],["en_AU.po",665],["en_GB.po",665],["eo.po",0],["es.po",686],["es_VE.po",284],["et.po",102],["eu.po",240],["fa.po",90],["fi.po",660],["fr.po",685],["gl.po",172],["he.po",686],["hi.po",0],["hr.po",686],["hu.po",664],["id.po",680],["ie.po",269],["it.po",685],["ja.po",676],["kk.po",53],["km.po",55],["kn.po",11],["ko.po",581],["lt.po",163],["lv.po",163],["mr.po",15],["ms.po",165],["my.po",13],["nb.po",503],["nl.po",338],["oc.po",164],["pl.po",686],["pt.po",318],["pt_BR.po",686],["pt_PT.po",262],["ro.po",170],["ru.po",685],["shn.po",0],["si.po",36],["sk.po",594],["sl.po",165],["sq.po",86],["sr.po",114],["sv.po",307],["te.po",14],["th.po",89],["tr.po",686],["ug.po",160],["uk.po",686],["uz@cyrillic.po",245],["zh_CN.po",560],["zh_TW.po",452]] },
{ name: "Fuzzy", data: [["ar.po",19],["ast.po",120],["bg.po",91],["bn.po",12],["br.po",0],["bs.po",120],["ca.po",11],["ca@valencia.po",11],["ckb.po",0],["cs.po",1],["da.po",0],["de.po",0],["el.po",122],["en_AU.po",11],["en_GB.po",11],["eo.po",0],["es.po",0],["es_VE.po",191],["et.po",61],["eu.po",4],["fa.po",7],["fi.po",14],["fr.po",1],["gl.po",120],["he.po",0],["hi.po",0],["hr.po",0],["hu.po",11],["id.po",1],["ie.po",118],["it.po",1],["ja.po",0],["kk.po",81],["km.po",37],["kn.po",4],["ko.po",63],["lt.po",120],["lv.po",120],["mr.po",4],["ms.po",120],["my.po",12],["nb.po",183],["nl.po",74],["oc.po",119],["pl.po",0],["pt.po",79],["pt_BR.po",0],["pt_PT.po",104],["ro.po",121],["ru.po",1],["shn.po",0],["si.po",17],["sk.po",51],["sl.po",120],["sq.po",50],["sr.po",94],["sv.po",358],["te.po",3],["th.po",93],["tr.po",0],["ug.po",123],["uk.po",0],["uz@cyrillic.po",144],["zh_CN.po",76],["zh_TW.po",169]] },
{ name: "Untranslated", data: [["ar.po",437],["ast.po",403],["bg.po",352],["bn.po",662],["br.po",686],["bs.po",403],["ca.po",5],["ca@valencia.po",5],["ckb.po",686],["cs.po",0],["da.po",0],["de.po",0],["el.po",378],["en_AU.po",10],["en_GB.po",10],["eo.po",686],["es.po",0],["es_VE.po",211],["et.po",523],["eu.po",442],["fa.po",589],["fi.po",12],["fr.po",0],["gl.po",394],["he.po",0],["hi.po",686],["hr.po",0],["hu.po",11],["id.po",5],["ie.po",299],["it.po",0],["ja.po",10],["kk.po",552],["km.po",594],["kn.po",671],["ko.po",42],["lt.po",403],["lv.po",403],["mr.po",667],["ms.po",401],["my.po",661],["nb.po",0],["nl.po",274],["oc.po",403],["pl.po",0],["pt.po",289],["pt_BR.po",0],["pt_PT.po",320],["ro.po",395],["ru.po",0],["shn.po",686],["si.po",633],["sk.po",41],["sl.po",401],["sq.po",550],["sr.po",478],["sv.po",21],["te.po",669],["th.po",504],["tr.po",0],["ug.po",403],["uk.po",0],["uz@cyrillic.po",297],["zh_CN.po",50],["zh_TW.po",65]] }
],
{ max: 686, stacked: true }
);
......
......@@ -58,7 +58,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
<property name="can_focus">False</property>
<property name="icon_name">org.remmina.Remmina</property>
<signal name="delete-event" handler="remmina_main_on_delete_event" swapped="no"/>
<signal name="destroy" handler="remmina_main_destroy" swapped="no"/>
<signal name="destroy" handler="remmina_main_on_destroy_event" swapped="no"/>
<signal name="drag-data-received" handler="remmina_main_on_drag_data_received" swapped="no"/>
<signal name="show" handler="remmina_main_on_show" swapped="no"/>
<signal name="window-state-event" handler="remmina_main_on_window_state_event" swapped="no"/>
......
......@@ -92,6 +92,103 @@ static char remmina_rdp_plugin_default_drive_name[] = "RemminaDisk";
static BOOL gfx_h264_available = FALSE;
/* Compatibility: these functions have been introduced with https://github.com/FreeRDP/FreeRDP/commit/8c5d96784d
* and are missing on older FreeRDP, so we add them here.
* They should be removed from here after all distributed versions of FreeRDP (libwinpr) will have
* CommandLineParseCommaSeparatedValuesEx() onboard.
*
* (C) Copyright goes to the FreeRDP authors.
*/
static char** remmina_rdp_CommandLineParseCommaSeparatedValuesEx(const char* name, const char* list, size_t* count)
{
char** p;
char* str;
size_t nArgs;
size_t index;
size_t nCommas;
size_t prefix, len;
nCommas = 0;
if (count == NULL)
return NULL;
*count = 0;
if (!list)
{
if (name)
{
size_t len = strlen(name);
p = (char**)calloc(2UL + len, sizeof(char*));
if (p)
{
char* dst = (char*)&p[1];
p[0] = dst;
sprintf_s(dst, len + 1, "%s", name);
*count = 1;
return p;
}
}
return NULL;
}
{
const char* it = list;
while ((it = strchr(it, ',')) != NULL)
{
it++;
nCommas++;
}
}
nArgs = nCommas + 1;
if (name)
nArgs++;
prefix = (nArgs + 1UL) * sizeof(char*);
len = strlen(list);
p = (char**)calloc(len + prefix + 1, sizeof(char*));
if (!p)
return NULL;
str = &((char*)p)[prefix];
memcpy(str, list, len);
if (name)
p[0] = (char*)name;
for (index = name ? 1 : 0; index < nArgs; index++)
{
char* comma = strchr(str, ',');
p[index] = str;
if (comma)
{
str = comma + 1;
*comma = '\0';
}
}
*count = nArgs;
return p;
}
static char** remmina_rdp_CommandLineParseCommaSeparatedValues(const char* list, size_t* count)
{
return remmina_rdp_CommandLineParseCommaSeparatedValuesEx(NULL, list, count);
}
/*
* End of CommandLineParseCommaSeparatedValuesEx() compatibility and copyright
*/
static BOOL rf_process_event_queue(RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
......@@ -676,6 +773,25 @@ static BOOL remmina_rdp_gw_authenticate(freerdp *instance, char **username, char
return True;
}
static DWORD remmina_rdp_verify_certificate_ex(freerdp* instance, const char* host, UINT16 port,
const char* common_name, const char* subject,
const char* issuer, const char* fingerprint, DWORD flags)
{
TRACE_CALL(__func__);
gint status;
rfContext *rfi;
RemminaProtocolWidget *gp;
rfi = (rfContext *)instance->context;
gp = rfi->protocol_widget;
status = remmina_plugin_service->protocol_plugin_init_certificate(gp, subject, issuer, fingerprint);
if (status == GTK_RESPONSE_OK)
return 1;
return 0;
}
static DWORD remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject,
const char *issuer, const char *fingerprint, BOOL host_mismatch)
......@@ -695,6 +811,29 @@ static DWORD remmina_rdp_verify_certificate(freerdp *instance, const char *commo
return 0;
}
static DWORD remmina_rdp_verify_changed_certificate_ex(freerdp* instance, const char* host, UINT16 port,
const char* common_name, const char* subject,
const char* issuer, const char* fingerprint,
const char* old_subject, const char* old_issuer,
const char* old_fingerprint, DWORD flags)
{
TRACE_CALL(__func__);
gint status;
rfContext *rfi;
RemminaProtocolWidget *gp;
rfi = (rfContext *)instance->context;
gp = rfi->protocol_widget;
status = remmina_plugin_service->protocol_plugin_changed_certificate(gp, subject, issuer, fingerprint, old_fingerprint);
if (status == GTK_RESPONSE_OK)
return 1;
return 0;
}
static DWORD remmina_rdp_verify_changed_certificate(freerdp *instance,
const char *common_name, const char *subject, const char *issuer,
const char *new_fingerprint, const char *old_subject, const char *old_issuer, const char *old_fingerprint)
......@@ -910,7 +1049,6 @@ int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t *dest)
* dest->options);
* @endcode
*/
const char *model = NULL;
RemminaFile *remminafile = remmina_plugin_service->protocol_plugin_get_file(gp);
const gchar *s = remmina_plugin_service->file_get_string(remminafile, "printer_overrides");
......@@ -950,8 +1088,7 @@ int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t *dest)
}
} else {
/* We set to a default driver*/
model = _strdup("MS Publisher Imagesetter");
printer->DriverName = _strdup(model);
printer->DriverName = _strdup("MS Publisher Imagesetter");
}
REMMINA_PLUGIN_DEBUG("Printer Driver: %s", printer->DriverName);
......@@ -1346,7 +1483,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
char **p;
size_t count;
p = CommandLineParseCommaSeparatedValuesEx("audin", g_strdup(cs), &count);
p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("audin", g_strdup(cs), &count);
freerdp_client_add_dynamic_channel(rfi->settings, count, p);
rfi->settings->AudioCapture = TRUE;
......@@ -1357,7 +1494,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
if (cs != NULL && cs[0] != '\0') {
char **p;
size_t count;
p = CommandLineParseCommaSeparatedValuesEx("urbdrc", g_strdup(cs), &count);
p = remmina_rdp_CommandLineParseCommaSeparatedValuesEx("urbdrc", g_strdup(cs), &count);
freerdp_client_add_dynamic_channel(rfi->settings, count, p);
g_free(p);
}
......@@ -1366,7 +1503,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
if (cs != NULL && cs[0] != '\0') {
char **p;
size_t count;
p = CommandLineParseCommaSeparatedValues(g_strdup(cs), &count);
p = remmina_rdp_CommandLineParseCommaSeparatedValues(g_strdup(cs), &count);
freerdp_client_add_static_channel(rfi->settings, count, p);
g_free(p);
}
......@@ -1375,7 +1512,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
if (cs != NULL && cs[0] != '\0') {
char **p;
size_t count;
p = CommandLineParseCommaSeparatedValues(g_strdup(cs), &count);
p = remmina_rdp_CommandLineParseCommaSeparatedValues(g_strdup(cs), &count);
freerdp_client_add_dynamic_channel(rfi->settings, count, p);
g_free(p);
}
......@@ -1766,8 +1903,10 @@ static void remmina_rdp_init(RemminaProtocolWidget *gp)
instance->PostDisconnect = remmina_rdp_post_disconnect;
instance->Authenticate = remmina_rdp_authenticate;
instance->GatewayAuthenticate = remmina_rdp_gw_authenticate;
instance->VerifyCertificate = remmina_rdp_verify_certificate;
instance->VerifyChangedCertificate = remmina_rdp_verify_changed_certificate;
//instance->VerifyCertificate = remmina_rdp_verify_certificate;
instance->VerifyCertificateEx = remmina_rdp_verify_certificate_ex;
//instance->VerifyChangedCertificate = remmina_rdp_verify_changed_certificate;
instance->VerifyChangedCertificateEx = remmina_rdp_verify_changed_certificate_ex;
instance->ContextSize = sizeof(rfContext);
freerdp_context_new(instance);
......@@ -2002,7 +2141,7 @@ static gpointer sound_list[] =
/* Array of key/value pairs for security */
static gpointer security_list[] =
{
"", N_("Automatically negotiate"),
"", N_("Automatic negotiation"),
"nla", N_("NLA protocol security"),
"tls", N_("TLS protocol security"),
"rdp", N_("RDP protocol security"),
......
......@@ -42,17 +42,18 @@
#include <gdk/gdkx.h>
static RemminaPluginService *remmina_plugin_service = NULL;
#define REMMINA_PLUGIN_DEBUG(fmt, ...) remmina_plugin_service->_remmina_debug(__func__, fmt, ##__VA_ARGS__)
static void remmina_plugin_tool_init(RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
remmina_plugin_service->_debug("[%s] Plugin init", PLUGIN_NAME);
REMMINA_PLUGIN_DEBUG("[%s] Plugin init", PLUGIN_NAME);
}
static gboolean remmina_plugin_tool_open_connection(RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
remmina_plugin_service->_debug("[%s] Plugin open connection", PLUGIN_NAME);
REMMINA_PLUGIN_DEBUG("[%s] Plugin open connection", PLUGIN_NAME);
GtkDialog *dialog;
dialog = GTK_DIALOG(gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL | GTK_DIALOG_USE_HEADER_BAR,
......@@ -65,7 +66,7 @@ static gboolean remmina_plugin_tool_open_connection(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_tool_close_connection(RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
remmina_plugin_service->_debug("[%s] Plugin close connection", PLUGIN_NAME);
REMMINA_PLUGIN_DEBUG("[%s] Plugin close connection", PLUGIN_NAME);
remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect");
return FALSE;
}
......
......@@ -62,3 +62,4 @@ es_VE
eo
fa
br
ckb
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.