Moved save_licence/load_licence back to rdesktop.c
git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@324 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
parent
00aadf6521
commit
5ab5ba17eb
163
licence.c
163
licence.c
@ -18,11 +18,6 @@
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include "rdesktop.h"
|
||||
|
||||
#ifdef WITH_OPENSSL
|
||||
@ -39,164 +34,6 @@ static uint8 licence_sign_key[16];
|
||||
|
||||
BOOL licence_issued = False;
|
||||
|
||||
|
||||
static int
|
||||
load_licence(unsigned char **data)
|
||||
{
|
||||
char *path;
|
||||
char *home;
|
||||
struct stat st;
|
||||
int fd;
|
||||
|
||||
home = getenv("HOME");
|
||||
if (home == NULL)
|
||||
return -1;
|
||||
|
||||
path = xmalloc(strlen(home) + strlen(hostname) + 20);
|
||||
sprintf(path, "%s/.rdesktop/licence.%s", home, hostname);
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
|
||||
if (fstat(fd, &st))
|
||||
return -1;
|
||||
|
||||
*data = xmalloc(st.st_size);
|
||||
return read(fd, *data, st.st_size);
|
||||
}
|
||||
|
||||
static void
|
||||
save_licence(unsigned char *data, int length)
|
||||
{
|
||||
char *fpath; /* file path for licence */
|
||||
char *fname, *fnamewrk; /* file name for licence .inkl path. */
|
||||
char *home;
|
||||
uint32 y;
|
||||
struct flock fnfl;
|
||||
int fnfd, fnwrkfd, i, wlen;
|
||||
struct stream s, *s_ptr;
|
||||
uint32 len;
|
||||
|
||||
/* Construct a stream, so that we can use macros to extract the
|
||||
* licence.
|
||||
*/
|
||||
s_ptr = &s;
|
||||
s_ptr->p = data;
|
||||
/* Skip first two bytes */
|
||||
in_uint16(s_ptr, len);
|
||||
|
||||
/* Skip three strings */
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
in_uint32(s_ptr, len);
|
||||
s_ptr->p += len;
|
||||
/* Make sure that we won't be past the end of data after
|
||||
* reading the next length value
|
||||
*/
|
||||
if ((s_ptr->p) + 4 > data + length)
|
||||
{
|
||||
printf("Error in parsing licence key.\n");
|
||||
printf("Strings %d end value %x > supplied length (%x)\n", i,
|
||||
(unsigned int) s_ptr->p, (unsigned int) data + length);
|
||||
return;
|
||||
}
|
||||
}
|
||||
in_uint32(s_ptr, len);
|
||||
if (s_ptr->p + len > data + length)
|
||||
{
|
||||
printf("Error in parsing licence key.\n");
|
||||
printf("End of licence %x > supplied length (%x)\n",
|
||||
(unsigned int) s_ptr->p + len, (unsigned int) data + length);
|
||||
return;
|
||||
}
|
||||
|
||||
home = getenv("HOME");
|
||||
if (home == NULL)
|
||||
return;
|
||||
|
||||
/* set and create the directory -- if it doesn't exist. */
|
||||
fpath = xmalloc(strlen(home) + 11);
|
||||
STRNCPY(fpath, home, strlen(home) + 1);
|
||||
|
||||
sprintf(fpath, "%s/.rdesktop", fpath);
|
||||
if (mkdir(fpath, 0700) == -1 && errno != EEXIST)
|
||||
{
|
||||
perror("mkdir");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* set the real licence filename, and put a write lock on it. */
|
||||
fname = xmalloc(strlen(fpath) + strlen(hostname) + 10);
|
||||
sprintf(fname, "%s/licence.%s", fpath, hostname);
|
||||
fnfd = open(fname, O_RDONLY);
|
||||
if (fnfd != -1)
|
||||
{
|
||||
fnfl.l_type = F_WRLCK;
|
||||
fnfl.l_whence = SEEK_SET;
|
||||
fnfl.l_start = 0;
|
||||
fnfl.l_len = 1;
|
||||
fcntl(fnfd, F_SETLK, &fnfl);
|
||||
}
|
||||
|
||||
/* create a temporary licence file */
|
||||
fnamewrk = xmalloc(strlen(fname) + 12);
|
||||
for (y = 0;; y++)
|
||||
{
|
||||
sprintf(fnamewrk, "%s.%lu", fname, (long unsigned int) y);
|
||||
fnwrkfd = open(fnamewrk, O_WRONLY | O_CREAT | O_EXCL, 0600);
|
||||
if (fnwrkfd == -1)
|
||||
{
|
||||
if (errno == EINTR || errno == EEXIST)
|
||||
continue;
|
||||
perror("create");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* write to the licence file */
|
||||
for (y = 0; y < len;)
|
||||
{
|
||||
do
|
||||
{
|
||||
wlen = write(fnwrkfd, s_ptr->p + y, len - y);
|
||||
}
|
||||
while (wlen == -1 && errno == EINTR);
|
||||
if (wlen < 1)
|
||||
{
|
||||
perror("write");
|
||||
unlink(fnamewrk);
|
||||
exit(1);
|
||||
}
|
||||
y += wlen;
|
||||
}
|
||||
|
||||
/* close the file and rename it to fname */
|
||||
if (close(fnwrkfd) == -1)
|
||||
{
|
||||
perror("close");
|
||||
unlink(fnamewrk);
|
||||
exit(1);
|
||||
}
|
||||
if (rename(fnamewrk, fname) == -1)
|
||||
{
|
||||
perror("rename");
|
||||
unlink(fnamewrk);
|
||||
exit(1);
|
||||
}
|
||||
/* close the file lock on fname */
|
||||
if (fnfd != -1)
|
||||
{
|
||||
fnfl.l_type = F_UNLCK;
|
||||
fnfl.l_whence = SEEK_SET;
|
||||
fnfl.l_start = 0;
|
||||
fnfl.l_len = 1;
|
||||
fcntl(fnfd, F_SETLK, &fnfl);
|
||||
close(fnfd);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Generate a session key and RC4 keys, given client and server randoms */
|
||||
static void
|
||||
licence_generate_keys(uint8 * client_key, uint8 * server_key, uint8 * client_rsa)
|
||||
|
2
proto.h
2
proto.h
@ -43,6 +43,8 @@ void error(char *format, ...);
|
||||
void warning(char *format, ...);
|
||||
void unimpl(char *format, ...);
|
||||
void hexdump(unsigned char *p, unsigned int len);
|
||||
int load_licence(unsigned char **data);
|
||||
void save_licence(unsigned char *data, int length);
|
||||
/* rdp.c */
|
||||
void rdp_out_unistr(STREAM s, char *string, int len);
|
||||
void rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1,
|
||||
|
159
rdesktop.c
159
rdesktop.c
@ -26,6 +26,7 @@
|
||||
#include <sys/stat.h> /* stat */
|
||||
#include <sys/time.h> /* gettimeofday */
|
||||
#include <sys/times.h> /* times */
|
||||
#include <errno.h>
|
||||
#include "rdesktop.h"
|
||||
|
||||
#ifdef EGD_SOCKET
|
||||
@ -513,3 +514,161 @@ hexdump(unsigned char *p, unsigned int len)
|
||||
line += thisline;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
load_licence(unsigned char **data)
|
||||
{
|
||||
char *path;
|
||||
char *home;
|
||||
struct stat st;
|
||||
int fd;
|
||||
|
||||
home = getenv("HOME");
|
||||
if (home == NULL)
|
||||
return -1;
|
||||
|
||||
path = xmalloc(strlen(home) + strlen(hostname) + 20);
|
||||
sprintf(path, "%s/.rdesktop/licence.%s", home, hostname);
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
|
||||
if (fstat(fd, &st))
|
||||
return -1;
|
||||
|
||||
*data = xmalloc(st.st_size);
|
||||
return read(fd, *data, st.st_size);
|
||||
}
|
||||
|
||||
void
|
||||
save_licence(unsigned char *data, int length)
|
||||
{
|
||||
char *fpath; /* file path for licence */
|
||||
char *fname, *fnamewrk; /* file name for licence .inkl path. */
|
||||
char *home;
|
||||
uint32 y;
|
||||
struct flock fnfl;
|
||||
int fnfd, fnwrkfd, i, wlen;
|
||||
struct stream s, *s_ptr;
|
||||
uint32 len;
|
||||
|
||||
/* Construct a stream, so that we can use macros to extract the
|
||||
* licence.
|
||||
*/
|
||||
s_ptr = &s;
|
||||
s_ptr->p = data;
|
||||
/* Skip first two bytes */
|
||||
in_uint16(s_ptr, len);
|
||||
|
||||
/* Skip three strings */
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
in_uint32(s_ptr, len);
|
||||
s_ptr->p += len;
|
||||
/* Make sure that we won't be past the end of data after
|
||||
* reading the next length value
|
||||
*/
|
||||
if ((s_ptr->p) + 4 > data + length)
|
||||
{
|
||||
printf("Error in parsing licence key.\n");
|
||||
printf("Strings %d end value %x > supplied length (%x)\n", i,
|
||||
(unsigned int) s_ptr->p, (unsigned int) data + length);
|
||||
return;
|
||||
}
|
||||
}
|
||||
in_uint32(s_ptr, len);
|
||||
if (s_ptr->p + len > data + length)
|
||||
{
|
||||
printf("Error in parsing licence key.\n");
|
||||
printf("End of licence %x > supplied length (%x)\n",
|
||||
(unsigned int) s_ptr->p + len, (unsigned int) data + length);
|
||||
return;
|
||||
}
|
||||
|
||||
home = getenv("HOME");
|
||||
if (home == NULL)
|
||||
return;
|
||||
|
||||
/* set and create the directory -- if it doesn't exist. */
|
||||
fpath = xmalloc(strlen(home) + 11);
|
||||
STRNCPY(fpath, home, strlen(home) + 1);
|
||||
|
||||
sprintf(fpath, "%s/.rdesktop", fpath);
|
||||
if (mkdir(fpath, 0700) == -1 && errno != EEXIST)
|
||||
{
|
||||
perror("mkdir");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* set the real licence filename, and put a write lock on it. */
|
||||
fname = xmalloc(strlen(fpath) + strlen(hostname) + 10);
|
||||
sprintf(fname, "%s/licence.%s", fpath, hostname);
|
||||
fnfd = open(fname, O_RDONLY);
|
||||
if (fnfd != -1)
|
||||
{
|
||||
fnfl.l_type = F_WRLCK;
|
||||
fnfl.l_whence = SEEK_SET;
|
||||
fnfl.l_start = 0;
|
||||
fnfl.l_len = 1;
|
||||
fcntl(fnfd, F_SETLK, &fnfl);
|
||||
}
|
||||
|
||||
/* create a temporary licence file */
|
||||
fnamewrk = xmalloc(strlen(fname) + 12);
|
||||
for (y = 0;; y++)
|
||||
{
|
||||
sprintf(fnamewrk, "%s.%lu", fname, (long unsigned int) y);
|
||||
fnwrkfd = open(fnamewrk, O_WRONLY | O_CREAT | O_EXCL, 0600);
|
||||
if (fnwrkfd == -1)
|
||||
{
|
||||
if (errno == EINTR || errno == EEXIST)
|
||||
continue;
|
||||
perror("create");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* write to the licence file */
|
||||
for (y = 0; y < len;)
|
||||
{
|
||||
do
|
||||
{
|
||||
wlen = write(fnwrkfd, s_ptr->p + y, len - y);
|
||||
}
|
||||
while (wlen == -1 && errno == EINTR);
|
||||
if (wlen < 1)
|
||||
{
|
||||
perror("write");
|
||||
unlink(fnamewrk);
|
||||
exit(1);
|
||||
}
|
||||
y += wlen;
|
||||
}
|
||||
|
||||
/* close the file and rename it to fname */
|
||||
if (close(fnwrkfd) == -1)
|
||||
{
|
||||
perror("close");
|
||||
unlink(fnamewrk);
|
||||
exit(1);
|
||||
}
|
||||
if (rename(fnamewrk, fname) == -1)
|
||||
{
|
||||
perror("rename");
|
||||
unlink(fnamewrk);
|
||||
exit(1);
|
||||
}
|
||||
/* close the file lock on fname */
|
||||
if (fnfd != -1)
|
||||
{
|
||||
fnfl.l_type = F_UNLCK;
|
||||
fnfl.l_whence = SEEK_SET;
|
||||
fnfl.l_start = 0;
|
||||
fnfl.l_len = 1;
|
||||
fcntl(fnfd, F_SETLK, &fnfl);
|
||||
close(fnfd);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user