Browse Source

Translation comments and README in English

master
Самоукин Алексей 13 years ago
parent
commit
e5328a9985
  1. 18
      README
  2. 59
      keyexec.c

18
README

@ -1,21 +1,21 @@
Это файл README для программы keyexec
Программа keyexec предназначена для доступа терминального клиента к
рабочему столу Windows.
Программа работает через rdesktop-клиент.
This is the README file for the program keyexec
Program keyexec designed to access a terminal client to
desktop Windows.
The program works through rdesktop-client.
Необходимые программы
Tools Needed
---------------------
rdesktop версии 1.2.0 и выше
pam_keystore версии 0.1 и выше
rdesktop version 1.2.0 and higher
pam_keystore version 0.1 and higher
Инсталяция
Installation
----------
make
make install
Удаление
Delete
--------
make uninstall

59
keyexec.c

@ -1,4 +1,4 @@
//Copyright 2007 Calculate Pack, http://www.calculate-linux.ru
// Copyright 2007-2010 Mir Calculate Ltd. http://www.calculate-linux.org
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -16,33 +16,33 @@
#include <stdlib.h>
#include <unistd.h>
// для пароля
// for password
#include <sys/types.h>
#include <pwd.h>
// для strcpy strlen
// for strcpy strlen
#include <string.h>
// для работы с ключами
// for keystore kernel
#include <keyutils.h>
//Статистика файла
// for statistics file
#include <fcntl.h>
#include <sys/stat.h>
int main( int argc, const char* argv[] )
{
// идентификатор пользователя
// user id and gid
uid_t uid, gid;
int ret;
int rez1,rez2;
void *buffer;
if (argc==1)
{
// получаем id и группу пользователя
// get user id and gid
uid = getuid();
gid = getgid();
//Устанавливаем права пользователя на этот процесс
// set user id and gid for the process
rez1 = setgid(gid);
rez2 = setuid(uid);
if (rez1==-1||rez2==-1)
@ -50,14 +50,14 @@ int main( int argc, const char* argv[] )
printf ("exec not SUID root\n");
exit(EXIT_FAILURE);
};
// ищем номер пользовательского ключа
// find user key in keystore
ret = request_key("user", "tmp", NULL, 0);
if (ret < 0)
{
printf ("id_key not found\n");
exit(EXIT_FAILURE);
};
// Возвращаем значение ключа
// get user key
int retf;
retf = keyctl_read_alloc(ret, &buffer);
if (retf < 0)
@ -65,12 +65,12 @@ int main( int argc, const char* argv[] )
printf("error keyctl_read_alloc\n");
exit(EXIT_FAILURE);
};
printf ("%s",buffer);
printf ("%s", (char*) buffer);
buffer = "XXXXXXXX";
key_serial_t dest;
// Получаем id пользовательског ключа
// get id user key
dest = KEY_SPEC_USER_SESSION_KEYRING;
// записываем ключ в пространство user
// write key in user space
ret = add_key("user", "tmp", buffer, strlen(buffer), dest);
exit(EXIT_SUCCESS);
};
@ -80,7 +80,7 @@ int main( int argc, const char* argv[] )
exit(EXIT_FAILURE);
}
// получаем id и группу пользователя
// get user id and gid
uid = getuid();
gid = getgid();
@ -89,7 +89,7 @@ int main( int argc, const char* argv[] )
char * prog_sring[10];
int count_prog =10;
// идентификатор и путь к программе
// identifiers and paths to programs
prog_name[0] = "rdesktop";
prog_path[0] = "/usr/bin/rdesktop";
prog_sring[0] = "";
@ -120,9 +120,9 @@ int main( int argc, const char* argv[] )
prog_name[9] = "rdesktop9";
prog_path[9] = "/usr/bin/rdesktop";
prog_sring[9] = "/usr/bin/kstart --window=.* --desktop=9";
// путь к выполняемой программе
// path to the running program
char * str_prog = NULL;
// В случае kstart
// if kstart
char * str_prog_ks = NULL;
int i;
@ -145,7 +145,7 @@ int main( int argc, const char* argv[] )
struct stat bufS;
int res;
int fd;
// Права файла на которые его проверяем
// file permissions for check
int mode_file = 33261;
fd = open(str_prog, O_RDONLY);
res = fstat(fd,&bufS);
@ -158,7 +158,7 @@ int main( int argc, const char* argv[] )
printf("No open file %s\n",str_prog);
exit(EXIT_FAILURE);
};
// Сравнение прав и владельца исполняемого файла с образцом
// comparison of permissions and owner of the executable file with the sample
if (bufS.st_mode == mode_file && bufS.st_uid == 0 && bufS.st_gid == 0)
{
struct passwd *pwd = getpwuid (uid);
@ -166,12 +166,12 @@ int main( int argc, const char* argv[] )
{
exit(EXIT_FAILURE);
};
// Получение имени пользователя
// get user name
char *login;
login = (char*) malloc (strlen(pwd->pw_name)+1);
strcpy (login,pwd->pw_name);
//устанавливаем права рута
// set permissions root
rez1 = setgid(0);
rez2 = setuid(0);
@ -182,7 +182,7 @@ int main( int argc, const char* argv[] )
};
int ret;
// ищем номер пользовательского ключа
// find user key in keystore
ret = request_key("user", login, NULL, 0);
if (ret < 0)
{
@ -190,14 +190,14 @@ int main( int argc, const char* argv[] )
exit(EXIT_FAILURE);
};
// Возвращаем значение ключа
// get user key
ret = keyctl_read_alloc(ret, &buffer);
if (ret < 0)
{
printf("error keyctl_read_alloc\n");
exit(EXIT_FAILURE);
}
//Устанавливаем права пользователя на этот процесс
// set user id and gid for the process
rez1 = setgid(gid);
rez2 = setuid(uid);
if (rez1==-1||rez2==-1)
@ -206,14 +206,13 @@ int main( int argc, const char* argv[] )
exit(EXIT_FAILURE);
};
key_serial_t dest;
// Получаем id пользовательског ключа
// get id user key
dest = KEY_SPEC_USER_SESSION_KEYRING;
//printf("DEST=%d\n",dest);
// записываем ключ в пространство user
// write key in user space
ret = add_key("user", "tmp", buffer, strlen(buffer), dest);
//printf("RET=%d\n",ret);
//Распределяем память и создаем строку запуска
// allocate memory and create a line running
char *buff;
if (str_prog_ks == "")
{
@ -227,7 +226,7 @@ int main( int argc, const char* argv[] )
buff = (char*) malloc (strlen(str_prog_ks)+strlen(com)+strlen(buffer)+strlen(str_prog)+strlen(argv[2])+1);
sprintf (buff, com, str_prog_ks, str_prog, argv[2]);
};
//Выполнение программы
// running program
system(buff);
free(login);
free (buff);

Loading…
Cancel
Save