~ubuntu-branches/ubuntu/jaunty/gnupg2/jaunty-security

« back to all changes in this revision

Viewing changes to agent/command.c

  • Committer: Bazaar Package Importer
  • Author(s): Eric Dorland
  • Date: 2008-04-28 03:22:20 UTC
  • mfrom: (1.1.10 upstream)
  • mto: This revision was merged to the branch mainline in revision 6.
  • Revision ID: james.westby@ubuntu.com-20080428032220-a8rl6klzavd4nvr4
Tags: 2.0.9-2
* The "I've neglected you too long" release.

* debian/control: 
  - Add recommends on gnupg-agent for gpgsm and gnupg2, since they need 
    it under most circumstances. (Closes: #459462, #477691)
  - Depend on pinentry instead of recommend, and move pinentry-gtk2 to the 
    front of the alternatives list. (Closes: #462951)
* keyserver/gpgkeys_curl.c, keyserver/gpgkeys_hkp.c: Fix FTBFS with gcc
  4.3 strictness on bitfields combined with curl. (Closes: #476999)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* command.c - gpg-agent command handler
2
2
 * Copyright (C) 2001, 2002, 2003, 2004, 2005,
3
 
 *               2006  Free Software Foundation, Inc.
 
3
 *               2006, 2008  Free Software Foundation, Inc.
4
4
 *
5
5
 * This file is part of GnuPG.
6
6
 *
60
60
  int stopme;    /* If set to true the agent will be terminated after
61
61
                    the end of this session.  */
62
62
#endif
 
63
  int allow_pinentry_notify; /* Set if pinentry notifications should
 
64
                                be done. */
63
65
};
64
66
 
65
67
 
318
320
}
319
321
 
320
322
 
 
323
/* Helper to notify the client about a launched Pinentry.  Because
 
324
   that might disturb some older clients, this is only done if enabled
 
325
   via an option.  Returns an gpg error code. */
 
326
gpg_error_t
 
327
agent_inq_pinentry_launched (ctrl_t ctrl, unsigned long pid)
 
328
{
 
329
  char line[100];
 
330
 
 
331
  if (!ctrl || !ctrl->server_local 
 
332
      || !ctrl->server_local->allow_pinentry_notify)
 
333
    return 0;
 
334
  snprintf (line, DIM(line)-1, "PINENTRY_LAUNCHED %lu", pid);
 
335
  return assuan_inquire (ctrl->server_local->assuan_ctx, line, NULL, NULL, 0);
 
336
}
 
337
 
 
338
 
321
339
 
322
340
/* GETEVENTCOUNTER
323
341
 
353
371
 
354
372
 
355
373
/* This function should be called once for all key removals or
356
 
   additions.  Thus function is assured not to do any context
 
374
   additions.  This function is assured not to do any context
357
375
   switches. */
358
376
void
359
377
bump_key_eventcounter (void)
363
381
}
364
382
 
365
383
/* This function should be called for all card reader status
366
 
   changes. Thus function is assured not to do any context
 
384
   changes.  This function is assured not to do any context
367
385
   switches. */
368
386
void
369
387
bump_card_eventcounter (void)
697
715
   part.  Here is an example transaction:
698
716
 
699
717
   C: GENKEY
700
 
   S: INQUIRE KEYPARM
 
718
   S: INQUIRE KEYPARAM
701
719
   C: D (genkey (rsa (nbits  1024)))
702
720
   C: END
703
721
   S: D (public-key
912
930
        }
913
931
      while (!rc
914
932
             && opt_check
915
 
             && check_passphrase_constraints (ctrl, response));
 
933
             && check_passphrase_constraints (ctrl, response, 0));
916
934
 
917
935
      if (!rc)
918
936
        {
1294
1312
  xfree (opt.startup_ttytype); opt.startup_ttytype = NULL;
1295
1313
  xfree (opt.startup_lc_ctype); opt.startup_lc_ctype = NULL;
1296
1314
  xfree (opt.startup_lc_messages); opt.startup_lc_messages = NULL;
 
1315
  xfree (opt.startup_xauthority); opt.startup_xauthority = NULL;
1297
1316
 
1298
1317
  if (ctrl->display)
1299
1318
    opt.startup_display = xtrystrdup (ctrl->display);
1305
1324
    opt.startup_lc_ctype = xtrystrdup (ctrl->lc_ctype);
1306
1325
  if (ctrl->lc_messages)
1307
1326
    opt.startup_lc_messages = xtrystrdup (ctrl->lc_messages);
 
1327
  if (ctrl->xauthority)
 
1328
    opt.startup_xauthority = xtrystrdup (ctrl->xauthority);
 
1329
  if (ctrl->pinentry_user_data)
 
1330
    opt.startup_pinentry_user_data = xtrystrdup (ctrl->pinentry_user_data);
1308
1331
 
1309
1332
  return 0;
1310
1333
}
1344
1367
   Supported values for WHAT are:
1345
1368
 
1346
1369
     version     - Return the version of the program.
 
1370
     pid         - Return the process id of the server.
1347
1371
     socket_name - Return the name of the socket.
1348
1372
     ssh_socket_name - Return the name of the ssh socket.
1349
1373
 
1358
1382
      const char *s = VERSION;
1359
1383
      rc = assuan_send_data (ctx, s, strlen (s));
1360
1384
    }
 
1385
  else if (!strcmp (line, "pid"))
 
1386
    {
 
1387
      char numbuf[50];
 
1388
 
 
1389
      snprintf (numbuf, sizeof numbuf, "%lu", (unsigned long)getpid ());
 
1390
      rc = assuan_send_data (ctx, numbuf, strlen (numbuf));
 
1391
    }
1361
1392
  else if (!strcmp (line, "socket_name"))
1362
1393
    {
1363
1394
      const char *s = get_agent_socket_name ();
1434
1465
      if (!ctrl->lc_messages)
1435
1466
        return out_of_core ();
1436
1467
    }
 
1468
  else if (!strcmp (key, "xauthority"))
 
1469
    {
 
1470
      if (ctrl->xauthority)
 
1471
        free (ctrl->xauthority);
 
1472
      ctrl->xauthority = strdup (value);
 
1473
      if (!ctrl->xauthority)
 
1474
        return out_of_core ();
 
1475
    }
 
1476
  else if (!strcmp (key, "pinentry-user-data"))
 
1477
    {
 
1478
      if (ctrl->pinentry_user_data)
 
1479
        free (ctrl->pinentry_user_data);
 
1480
      ctrl->pinentry_user_data = strdup (value);
 
1481
      if (!ctrl->pinentry_user_data)
 
1482
        return out_of_core ();
 
1483
    }
1437
1484
  else if (!strcmp (key, "use-cache-for-signing"))
1438
1485
    ctrl->server_local->use_cache_for_signing = *value? atoi (value) : 0;
 
1486
  else if (!strcmp (key, "allow-pinentry-notify"))
 
1487
    ctrl->server_local->allow_pinentry_notify = 1;
1439
1488
  else
1440
1489
    return gpg_error (GPG_ERR_UNKNOWN_OPTION);
1441
1490
 
1544
1593
   control structure for this connection; it has only the basic
1545
1594
   intialization. */
1546
1595
void
1547
 
start_command_handler (ctrl_t ctrl, int listen_fd, int fd)
 
1596
start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
1548
1597
{
1549
1598
  int rc;
1550
1599
  assuan_context_t ctx;
1551
1600
 
1552
 
  if (listen_fd == -1 && fd == -1)
 
1601
  if (listen_fd == GNUPG_INVALID_FD && fd == GNUPG_INVALID_FD)
1553
1602
    {
1554
1603
      int filedes[2];
1555
1604
 
1557
1606
      filedes[1] = 1;
1558
1607
      rc = assuan_init_pipe_server (&ctx, filedes);
1559
1608
    }
1560
 
  else if (listen_fd != -1)
 
1609
  else if (listen_fd != GNUPG_INVALID_FD)
1561
1610
    {
1562
1611
      rc = assuan_init_socket_server_ext (&ctx, listen_fd, 0);
1563
1612
    }
1564
1613
  else 
1565
1614
    {
1566
1615
      rc = assuan_init_socket_server_ext (&ctx, fd, 2);
1567
 
      ctrl->connection_fd = fd;
1568
1616
    }
1569
1617
  if (rc)
1570
1618
    {