示例#1
0
static void
send_as_image (PidginWindow * win,
               PidginConversation * _gtkconv) {
    PurplePlugin *plugin = purple_plugins_find_with_id (PLUGIN_ID);

    if (PLUGIN (locked))
        return;                 /* Just return, don't fail. */
    else {
        PidginConversation *gtkconv;

        PLUGIN (locked) = TRUE;
        PLUGIN (send_as) = SEND_AS_IMAGE;

        if (win != NULL)
            gtkconv =
                PIDGIN_CONVERSATION
                (pidgin_conv_window_get_active_conversation (win));
        else
            gtkconv = _gtkconv;


        REMEMBER_ACCOUNT (gtkconv);

        PLUGIN (conv_features) = gtkconv->active_conv->features;
        freeze_desktop (plugin, FALSE);
    }
}
示例#2
0
/** Eventually ask for a custom capture name when sending :
    - as file 
    - to a remote FTP server
*/
void
screenshot_maybe_rename (PurplePlugin * plugin, gchar ** basename) {
    g_assert (plugin != NULL && plugin->extra != NULL);

    if (purple_prefs_get_bool (PREF_ASK_FILENAME) &&
        (PLUGIN (send_as) == SEND_AS_FILE
#ifdef ENABLE_UPLOAD
         || PLUGIN (send_as) == SEND_AS_FTP_LINK)
#else
        )
#endif
        ) {
        GtkWidget *dlgbox_rename = NULL;
        gint result = 0;

        dlgbox_rename = capture_rename (plugin, *basename);
        result = gtk_dialog_run (GTK_DIALOG (dlgbox_rename));

        if (result == GTK_RESPONSE_OK) {
            GtkWidget *entry = NULL;

            entry = g_object_get_data (G_OBJECT (dlgbox_rename), "entry");

            g_free (*basename);
            *basename = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
        }
        gtk_widget_destroy (dlgbox_rename);
    }
}
示例#3
0
static void
send_as_link (PidginWindow * win,
                                  PidginConversation * _gtkconv) {
    PurplePlugin *plugin;

    plugin = purple_plugins_find_with_id (PLUGIN_ID);

    if (PLUGIN (locked))
        return;                 /* Just return, don't fail. */
    else {
        PidginConversation *gtkconv;

        PLUGIN (locked) = TRUE;
        PLUGIN (send_as) = SEND_AS_HTTP_LINK;

        if (win != NULL)
            gtkconv =
                PIDGIN_CONVERSATION
                (pidgin_conv_window_get_active_conversation (win));
        else
            gtkconv = _gtkconv;

        if (!strcmp (purple_prefs_get_string (PREF_UPLOAD_TO), HOST_DISABLED)) {
            purple_notify_error (plugin, PLUGIN_NAME, PLUGIN_ERROR,
                                 PLUGIN_HOST_DISABLED_ERROR);
            plugin_stop (plugin);
            return;
        }
        REMEMBER_ACCOUNT (gtkconv);

        PLUGIN (conv_features) = gtkconv->active_conv->features;
        freeze_desktop (plugin, FALSE);
    }
}
示例#4
0
/** Implements the init_input function of the plugin API */
int corsaro_dos_init_input(corsaro_in_t *corsaro)
{
  struct corsaro_dos_in_state_t *state;
  corsaro_plugin_t *plugin = PLUGIN(corsaro);
  assert(plugin != NULL);

  if((state = malloc_zero(sizeof(struct corsaro_dos_in_state_t)))
     == NULL)
    {
      corsaro_log_in(__func__, corsaro,
		"could not malloc corsaro_dos_state_t");
      goto err;
    }
  corsaro_plugin_register_state(corsaro->plugin_manager, plugin, state);

  /* we initially expect an corsaro interval record */
  state->expected_type = CORSARO_IN_RECORD_TYPE_IO_INTERVAL_START;

  /* don't set the vector_cnt until we actually see a header record */

  return 0;

 err:
  corsaro_dos_close_input(corsaro);
  return -1;
}
示例#5
0
/** Implements the init_output function of the plugin API */
int corsaro_dos_init_output(corsaro_t *corsaro)
{
  struct corsaro_dos_state_t *state;
  /* retrieve a pointer to the plugin struct with our name and id */
  corsaro_plugin_t *plugin = PLUGIN(corsaro);
  assert(plugin != NULL);

  /*
   * allocate memory for the state structure which will hold a pointer to the
   * output file and other statistics
   */
  if((state = malloc_zero(sizeof(struct corsaro_dos_state_t))) == NULL)
    {
      corsaro_log(__func__, corsaro,
		"could not malloc corsaro_dos_state_t");
      goto err;
    }
  /*
   * register the state structure with the plugin manager
   * this associates it with our plugin id so it can be retrieved later
   */
  corsaro_plugin_register_state(corsaro->plugin_manager, plugin, state);

  /* init the hash table for attack vectors */
  state->attack_hash = kh_init(av);

  return 0;

 err:
  corsaro_dos_close_output(corsaro);
  return -1;
}
示例#6
0
/** Implements the init_output function of the plugin API */
int corsaro_anon_init_output(corsaro_t *corsaro)
{
  struct corsaro_anon_state_t *state;
  corsaro_plugin_t *plugin = PLUGIN(corsaro);

  assert(plugin != NULL);

  if((state = malloc_zero(sizeof(struct corsaro_anon_state_t))) == NULL)
    {
      corsaro_log(__func__, corsaro,
		"could not malloc corsaro_anon_state_t");
      goto err;
    }
  corsaro_plugin_register_state(corsaro->plugin_manager, plugin, state);

  /* set the defaults */
  state->encryption_type = CORSARO_ANON_ENC_CRYPTOPAN;
  state->encrypt_source = ANON_SOURCE;
  state->encrypt_destination = ANON_DEST;

  /* parse the arguments */
  if(parse_args(corsaro) != 0)
    {
      return -1;
    }

  assert(state->encryption_key != NULL);

  corsaro_anon_init(state->encryption_type, state->encryption_key);
  return 0;

 err:
  corsaro_anon_close_output(corsaro);
  return -1;
}
示例#7
0
/** Parse the arguments given to the plugin */
static int parse_args(bgpcorsaro_t *bgpcorsaro)
{
  bgpcorsaro_plugin_t *plugin = PLUGIN(bgpcorsaro);
  struct bgpcorsaro_pacifier_state_t *state = STATE(bgpcorsaro);
  int opt;

  if(plugin->argc <= 0)
    {
      return 0;
    }

  /* NB: remember to reset optind to 1 before using getopt! */
  optind = 1;

  while((opt = getopt(plugin->argc, plugin->argv, ":w:a?")) >= 0)
    {
      switch(opt)
	{
	case 'w':
	  state->wait = atoi(optarg);
	  break;
	case 'a':
	  state->adaptive = 1;
	  break;
	case '?':
	case ':':
	default:
	  usage(plugin);
	  return -1;
	}
    }

  return 0;
}
/** Implements the close_output function of the plugin API */
int bgpcorsaro_pfxmonitor_close_output(bgpcorsaro_t *bgpcorsaro)
{
  int i;
  struct bgpcorsaro_pfxmonitor_state_t *state = STATE(bgpcorsaro);
  khiter_t k;
  khash_t(peer_asn_map) * v;

  if (state == NULL) {
    return 0;
  }

  /* close all the outfile pointers */
  for (i = 0; i < OUTFILE_POINTERS; i++) {
    if (state->outfile_p[i] != NULL) {
      wandio_wdestroy(state->outfile_p[i]);
      state->outfile_p[i] = NULL;
    }
  }
  state->outfile = NULL;
  if (state->poi != NULL) {
    bgpstream_ip_counter_destroy(state->poi);
    state->poi = NULL;
  }

  /* deallocate the dynamic memory in use */
  if (state->overlapping_pfx_cache != NULL) {
    bgpstream_pfx_storage_set_destroy(state->overlapping_pfx_cache);
    state->overlapping_pfx_cache = NULL;
  }

  if (state->non_overlapping_pfx_cache != NULL) {
    bgpstream_pfx_storage_set_destroy(state->non_overlapping_pfx_cache);
    state->non_overlapping_pfx_cache = NULL;
  }

  if (state->peer_asns != NULL) {
    bgpstream_id_set_destroy(state->peer_asns);
    state->peer_asns = NULL;
  }

  if (state->pfx_info != NULL) {
    for (k = kh_begin(state->pfx_info); k != kh_end(state->pfx_info); ++k) {
      if (kh_exist(state->pfx_info, k)) {
        v = kh_val(state->pfx_info, k);
        kh_destroy(peer_asn_map, v);
      }
    }
    kh_destroy(pfx_info_map, state->pfx_info);
    state->pfx_info = NULL;
  }

  if (state->unique_origins != NULL) {
    bgpstream_id_set_destroy(state->unique_origins);
    state->unique_origins = NULL;
  }

  bgpcorsaro_plugin_free_state(bgpcorsaro->plugin_manager, PLUGIN(bgpcorsaro));
  return 0;
}
示例#9
0
/** Implements the close_input function of the plugin API */
int corsaro_dos_close_input(corsaro_in_t *corsaro)
{
  struct corsaro_dos_in_state_t *state = STATE_IN(corsaro);

  if(state != NULL)
    {
      corsaro_plugin_free_state(corsaro->plugin_manager, PLUGIN(corsaro));
    }
  return 0;
}
示例#10
0
/** Implements the init_output function of the plugin API */
int bgpcorsaro_pfxmonitor_init_output(bgpcorsaro_t *bgpcorsaro)
{
  struct bgpcorsaro_pfxmonitor_state_t *state;
  bgpcorsaro_plugin_t *plugin = PLUGIN(bgpcorsaro);
  assert(plugin != NULL);

  if ((state = malloc_zero(sizeof(struct bgpcorsaro_pfxmonitor_state_t))) ==
      NULL) {
    bgpcorsaro_log(__func__, bgpcorsaro,
                   "could not malloc bgpcorsaro_pfxmonitor_state_t");
    goto err;
  }
  bgpcorsaro_plugin_register_state(bgpcorsaro->plugin_manager, plugin, state);

  /* initialize state with default values */
  state = STATE(bgpcorsaro);
  strncpy(state->metric_prefix, PFXMONITOR_DEFAULT_METRIC_PFX,
          PFXMONITOR_METRIC_PFX_LEN);
  strncpy(state->ip_space_name, PFXMONITOR_DEFAULT_IPSPACE_NAME,
          PFXMONITOR_METRIC_PFX_LEN);

  if ((state->poi = bgpstream_ip_counter_create()) == NULL) {
    goto err;
  }
  state->peer_asns_th = PFXMONITOR_DEFAULT_PEER_ASNS_THRESHOLD;
  state->more_specific = 0;

  /* parse the arguments */
  if (parse_args(bgpcorsaro) != 0) {
    goto err;
  }

  graphite_safe(state->metric_prefix);
  graphite_safe(state->ip_space_name);

  /* create all the sets and maps we need */
  if ((state->overlapping_pfx_cache = bgpstream_pfx_storage_set_create()) ==
        NULL ||
      (state->non_overlapping_pfx_cache = bgpstream_pfx_storage_set_create()) ==
        NULL ||
      (state->pfx_info = kh_init(pfx_info_map)) == NULL ||
      (state->unique_origins = bgpstream_id_set_create()) == NULL ||
      (state->peer_asns = bgpstream_id_set_create()) == NULL) {
    goto err;
  }

  /* defer opening the output file until we start the first interval */

  return 0;

err:
  bgpcorsaro_pfxmonitor_close_output(bgpcorsaro);
  return -1;
}
/* store screenshot contents in buf */
static size_t
read_callback (void *buf, size_t size, size_t nmemb, void *stream) {
    PurplePlugin *plugin;
    GIOChannel *io_chan;
    GError *error = NULL;
    size_t ret;

    plugin = purple_plugins_find_with_id (PLUGIN_ID);
    io_chan = (GIOChannel *) stream;

    g_io_channel_read_chars (io_chan, buf, size * nmemb, &ret, &error);

    if (error != NULL) {
        g_propagate_error (&PLUGIN (error), error);
        return CURL_READFUNC_ABORT;
    }

    PLUGIN (read_size) += ret;  /* progress bar */
    return ret;
}
示例#12
0
static guint
update_countdown (PurplePlugin * plugin) {
    GtkWidget *progress_bar = NULL;

    g_assert (plugin != NULL && plugin->extra != NULL);

    if (PLUGIN (countdown_dialog) == NULL)      /* forced or canceled  */
        return FALSE;

    progress_bar =
        g_object_get_data (G_OBJECT (PLUGIN (countdown_dialog)),
                           "progress-bar");

    if (progress_bar != NULL) {
        gdouble val =
            gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress_bar));

        gdouble incr = 250.0 / ((gdouble)
                                ((purple_prefs_get_int
                                  (PREF_WAIT_BEFORE_SCREENSHOT) -
                                  1)) * 1000.0);
        if (val < 0.99) {
            gchar *text = NULL;
            text = g_strdup_printf ("%.02f sec.", ((gdouble)
                                                   purple_prefs_get_int
                                                   (PREF_WAIT_BEFORE_SCREENSHOT))
                                    * (1.0 - (val + incr)));
            gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress_bar),
                                           MIN (val + incr, 1.0));
            gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress_bar), text);
            g_free (text);

            return TRUE;
        }
        else {
            gtk_widget_destroy (PLUGIN (countdown_dialog));
            PLUGIN (countdown_dialog) = NULL;
        }
    }
    return FALSE;
}
示例#13
0
/** Implements the start_interval function of the plugin API */
int corsaro_dos_start_interval(corsaro_t *corsaro, corsaro_interval_t *int_start)
{
  /* open the output file if it has been closed */
  if(STATE(corsaro)->outfile == NULL &&
     (STATE(corsaro)->outfile =
      corsaro_io_prepare_file(corsaro, PLUGIN(corsaro)->name,
			      int_start)) == NULL)
    {
      corsaro_log(__func__, corsaro, "could not open %s output file",
		  PLUGIN(corsaro)->name);
      return -1;
    }

  if(STATE(corsaro)->first_interval == 0)
    {
      /* -1 to simulate the end of the 'previous' interval */
      STATE(corsaro)->first_interval = int_start->time-1;
    }

  return 0;
}
示例#14
0
/** Implements the start_interval function of the plugin API */
int bgpcorsaro_pacifier_start_interval(bgpcorsaro_t *bgpcorsaro,
				       bgpcorsaro_interval_t *int_start)
{
  struct bgpcorsaro_pacifier_state_t *state = STATE(bgpcorsaro);

  if(state->outfile == NULL)
    {
      if((
	  state->outfile_p[state->outfile_n] =
	  bgpcorsaro_io_prepare_file(bgpcorsaro,
				     PLUGIN(bgpcorsaro)->name,
				     int_start)) == NULL)
	{
	  bgpcorsaro_log(__func__, bgpcorsaro, "could not open %s output file",
			 PLUGIN(bgpcorsaro)->name);
	  return -1;
	}
      state->outfile = state->
	outfile_p[state->outfile_n];
    }

  bgpcorsaro_io_write_interval_start(bgpcorsaro, state->outfile, int_start);

  struct timeval tv;

  if(state->tv_start == 0)
    {
      gettimeofday_wrap(&tv);
      state->tv_start = tv.tv_sec;
      state->tv_first_time = state->tv_start;
    }

  // a new interval is starting
  state->intervals++;
  
  // fprintf(stderr, "START INTERVAL TIME: %d \n", state->tv_start);

  return 0;
}
示例#15
0
/** Implements the start_interval function of the plugin API */
int bgpcorsaro_pfxmonitor_start_interval(bgpcorsaro_t *bgpcorsaro,
                                         bgpcorsaro_interval_t *int_start)
{
  struct bgpcorsaro_pfxmonitor_state_t *state = STATE(bgpcorsaro);

  /* open an output file */
  if (state->outfile == NULL) {
    if ((state->outfile_p[state->outfile_n] = bgpcorsaro_io_prepare_file(
           bgpcorsaro, PLUGIN(bgpcorsaro)->name, int_start)) == NULL) {
      bgpcorsaro_log(__func__, bgpcorsaro, "could not open %s output file",
                     PLUGIN(bgpcorsaro)->name);
      return -1;
    }
    state->outfile = state->outfile_p[state->outfile_n];
  }

  bgpcorsaro_io_write_interval_start(bgpcorsaro, state->outfile, int_start);

  /* save the interval start to correctly output the time series values */
  state->interval_start = int_start->time;

  return 0;
}
示例#16
0
static
    void
on_countdown_dialog_response_cb (PurplePlugin * plugin, gint response_id) {

    g_assert (plugin != NULL && plugin->extra != NULL);

    switch (response_id) {
    case GTK_RESPONSE_ACCEPT:
        {
            if (purple_timeout_remove (PLUGIN (timeout_source))) {
                PLUGIN (timeout_source) = 0;
                /* delete_infobar (plugin); */

                gtk_widget_destroy (PLUGIN (countdown_dialog));
                PLUGIN (countdown_dialog) = NULL;

                PLUGIN (timeout_source) =
                    purple_timeout_add
                    (MSEC_TIMEOUT_VAL, (GSourceFunc) timeout_freeze_screen,
                     plugin);

            }
            break;
        }
    case GTK_RESPONSE_REJECT:
    case GTK_RESPONSE_DELETE_EVENT:
        {

            if (purple_timeout_remove (PLUGIN (timeout_source))) {
                PLUGIN (timeout_source) = 0;
                gtk_widget_destroy (PLUGIN (countdown_dialog));
                PLUGIN (countdown_dialog) = NULL;
                plugin_stop (plugin);
            }
            break;
        }
    }

}
示例#17
0
void add_plugin_to_menu (gpointer data, gpointer user_data)
{
    static int i=1;
    GtkPluginManagerMenu *menu=(GtkPluginManagerMenu *) user_data;
    GtkWidget *item;
    Plugin *plugin;
    plugin = PLUGIN(data);
    /*
    * Syntax plugins are automatically incorporate to the syntax check system so don't show that plugins here.
    * TODO: maybe configure this in preferences??
    */
    if (get_plugin_syntax_type(plugin)==-1){ 
    item =  gtk_menu_item_new_image_item(GTK_STOCK_EXECUTE, get_plugin_name(plugin));
    gtk_widget_show(item);
    install_menu_hint(item, (gchar *)get_plugin_description(plugin), &main_window);
    g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(plugin_exec), (gpointer) menu);
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
    if (i<10) gtk_widget_add_accelerator(item, "activate", menu->priv->accel_group, parse_shortcut(i), GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
    i++;
    }
}
示例#18
0
/** Implements the close_output function of the plugin API */
int bgpcorsaro_pacifier_close_output(bgpcorsaro_t *bgpcorsaro)
{
  int i;
  struct bgpcorsaro_pacifier_state_t *state = STATE(bgpcorsaro);

  if(state != NULL)
    {
      /* close all the outfile pointers */
      for(i = 0; i < OUTFILE_POINTERS; i++)
	{
	  if(state->outfile_p[i] != NULL)
	    {
	      wandio_wdestroy(state->outfile_p[i]);
	      state->outfile_p[i] = NULL;
	    }
	}
      state->outfile = NULL;
      bgpcorsaro_plugin_free_state(bgpcorsaro->plugin_manager, PLUGIN(bgpcorsaro));
    }
  return 0;
}
示例#19
0
/** Implements the close_output function of the plugin API */
int corsaro_dos_close_output(corsaro_t *corsaro)
{
  struct corsaro_dos_state_t *state = STATE(corsaro);

  if(state != NULL)
    {
      if(state->attack_hash != NULL)
	{
	  kh_free(av, state->attack_hash, &attack_vector_free);
	  kh_destroy(av, state->attack_hash);
	  state->attack_hash = NULL;
	}

      if(state->outfile != NULL)
	{
	  corsaro_file_close(corsaro, state->outfile);
	  state->outfile = NULL;
	}
      corsaro_plugin_free_state(corsaro->plugin_manager, PLUGIN(corsaro));
    }
  return 0;
}
示例#20
0
/**
 * Handle hiding and showing stuff based on what type of conv this is...
 */
static void
on_conversation_menu_show_cb (PidginWindow * win) {
    PurpleConversation *conv;
    GtkWidget *conversation_menu, *img_menuitem, *screenshot_menuitem;
#ifdef ENABLE_UPLOAD
    GtkWidget *link_menuitem, *ftp_link_menuitem;
#endif

    PurplePlugin *plugin = purple_plugins_find_with_id (PLUGIN_ID);

    conv = pidgin_conv_window_get_active_conversation (win);
    conversation_menu =
        gtk_item_factory_get_widget (win->menu.item_factory,
                                     N_("/Conversation"));
#ifdef ENABLE_UPLOAD
    link_menuitem =
        g_object_get_data (G_OBJECT (conversation_menu), "link_menuitem");
    ftp_link_menuitem =
        g_object_get_data (G_OBJECT (conversation_menu), "ftp_link_menuitem");
    on_screenshot_insert_as_link_show_cb (link_menuitem,
                                          PIDGIN_CONVERSATION (conv));
    on_screenshot_insert_as_ftp_link_show_cb (ftp_link_menuitem,
                                              PIDGIN_CONVERSATION (conv));
#endif

    img_menuitem =
        g_object_get_data (G_OBJECT (conversation_menu), "img_menuitem");
    
    //  on_screenshot_insert_as_image_show_cb (img_menuitem,
    //                                     PIDGIN_CONVERSATION (conv));

    screenshot_menuitem =
        g_object_get_data (G_OBJECT (conversation_menu),
                           "screenshot_menuitem");

    gtk_widget_set_sensitive (screenshot_menuitem, !PLUGIN (locked));
}
示例#21
0
/** Implements the init_output function of the plugin API */
int bgpcorsaro_pacifier_init_output(bgpcorsaro_t *bgpcorsaro)
{
  struct bgpcorsaro_pacifier_state_t *state;
  bgpcorsaro_plugin_t *plugin = PLUGIN(bgpcorsaro);
  assert(plugin != NULL);

  if((state = malloc_zero(sizeof(struct bgpcorsaro_pacifier_state_t))) == NULL)
    {
      bgpcorsaro_log(__func__, bgpcorsaro,
		     "could not malloc bgpcorsaro_pacifier_state_t");
      goto err;
    }
  bgpcorsaro_plugin_register_state(bgpcorsaro->plugin_manager, plugin, state);


  // initializing state
  state = STATE(bgpcorsaro);
  state->tv_start = 0;      // 0 means it is the first interval, so the time has to be initialized at interval start
  state->wait = 30;         // 30 seconds is the default wait time, between start and end
  state->tv_first_time = 0; // 0 means it is the first interval, so the time has to be initialized at interval start
  state->intervals = 0;     // number of intervals processed
  state->adaptive = 0;      // default behavior is not adaptive
  
  /* parse the arguments */
  if(parse_args(bgpcorsaro) != 0)
    {
      return -1;
    }

  /* defer opening the output file until we start the first interval */

  return 0;

 err:
  bgpcorsaro_pacifier_close_output(bgpcorsaro);
  return -1;
}
void
ftp_upload_prepare (PurplePlugin * plugin) {
    struct host_param_data *host_data;

    g_assert (plugin != NULL && plugin->extra != NULL);

    host_data = PLUGIN (host_data);

    g_assert (PLUGIN (uploading_dialog) == NULL);
    g_assert (PLUGIN (libcurl_thread) == NULL);

    PLUGIN (read_size) = 0;

    PLUGIN (uploading_dialog) =
        show_uploading_dialog (plugin,
                               purple_prefs_get_string (PREF_FTP_REMOTE_URL));
    PLUGIN (libcurl_thread) =
        g_thread_create ((GThreadFunc) ftp_upload, plugin, FALSE, NULL);

    PLUGIN (timeout_cb_handle) =
        g_timeout_add (PLUGIN_UPLOAD_PROGRESS_INTERVAL,
                       (GSourceFunc) insert_ftp_link_cb, plugin);
}
示例#23
0
static void
on_blist_context_menu_send_capture (PurpleBuddy * buddy,
                                    PurplePlugin * plugin) {


    if (PLUGIN (locked))
        return;                 /* Just return, don't fail. */
    else {
        PLUGIN (locked) = TRUE;

        PLUGIN (send_as) = SEND_AS_FILE;

        PLUGIN (conv_type) = PURPLE_CONV_TYPE_UNKNOWN;  /* no conv opened */
        PLUGIN (account) = purple_buddy_get_account (buddy);
        PLUGIN (name) = g_strdup_printf ("%s", purple_buddy_get_name (buddy));

        /* see on_screenshot_insert_as_image_activate_cb () */
        freeze_desktop (plugin, FALSE);
    }
}
示例#24
0
/** Implements the end_interval function of the plugin API */
int corsaro_dos_end_interval(corsaro_t *corsaro, corsaro_interval_t *int_end)
{
  int this_interval = int_end->time-STATE(corsaro)->first_interval;

  khiter_t i;
  attack_vector_t *vector;
  attack_vector_t **attack_arr = NULL;
  int attack_arr_cnt = 0;

  uint8_t gbuf[12];
  uint8_t cntbuf[4];

  if(this_interval < CORSARO_DOS_INTERVAL)
    {
      /* we haven't run for long enough to dump */
      return 0;
    }
  else
    {
      /* we either have hit exactly the right amount of time,
	 or we have gone for too long, dump now and reset the counter */
      STATE(corsaro)->first_interval = int_end->time;
      /* fall through and continue to dump */
    }

  /* this is an interval we care about */

  /* malloc an array big enough to hold the entire hash even though we wont
     need it to be that big */
  if((attack_arr =
      malloc(sizeof(attack_vector_t *)*
	     kh_size(STATE(corsaro)->attack_hash))) == NULL)
    {
      corsaro_log(__func__, corsaro,
		  "could not malloc array for attack vectors");
      return -1;
    }

  /* classify the flows and dump the attack ones */

  for(i = kh_begin(STATE(corsaro)->attack_hash);
      i != kh_end(STATE(corsaro)->attack_hash); ++i)
    {
      if(kh_exist(STATE(corsaro)->attack_hash, i))
	{
	  vector = kh_key(STATE(corsaro)->attack_hash, i);

	  if(attack_vector_is_expired(vector, int_end->time) != 0)
	    {
	      kh_del(av, STATE(corsaro)->attack_hash, i);
	      attack_vector_free(vector);
	      vector = NULL;
	    }
	  else if(attack_vector_is_attack(corsaro, vector, int_end->time) != 0)
	    {
	      /* this is an attack */
	      /* add it to the attack array so we can know how many
		 before we dump it */
	      attack_arr[attack_arr_cnt] = vector;
	      attack_arr_cnt++;
	    }
	  else
	    {
	      attack_vector_reset(vector);
	    }
	}
    }

  corsaro_io_write_interval_start(corsaro, STATE(corsaro)->outfile,
				  &corsaro->interval_start);
  if(corsaro->global_file != NULL)
    {
      corsaro_io_write_plugin_start(corsaro, corsaro->global_file,
				    PLUGIN(corsaro));
    }
  if(CORSARO_FILE_MODE(STATE(corsaro)->outfile) == CORSARO_FILE_MODE_ASCII)
    {
      if(corsaro->global_file != NULL)
	{
	  /* global stats */
	  /* dump the number of mismatched packets and vectors */
	  corsaro_file_printf(corsaro, corsaro->global_file,
			      "mismatch: %"PRIu32"\n"
			      "attack_vectors: %"PRIu32"\n"
			      "non-attack_vectors: %"PRIu32"\n",
			      STATE(corsaro)->number_mismatched_packets,
			      attack_arr_cnt,
			      kh_size(STATE(corsaro)->attack_hash)
			      -attack_arr_cnt);
	}

      /* dump the number of vectors */
      corsaro_file_printf(corsaro, STATE(corsaro)->outfile, "%"PRIu32"\n",
			attack_arr_cnt);
      /* dump the vectors */
      for(i = 0; i < attack_arr_cnt; i++)
	{
	  if(ascii_dump(corsaro, attack_arr[i]) != 0)
	    {
	      corsaro_log(__func__, corsaro, "could not dump hash");
	      return -1;
	    }
	  /* reset the interval stats */
	  attack_vector_reset(attack_arr[i]);
	}
    }
  else if(CORSARO_FILE_MODE(STATE(corsaro)->outfile) == CORSARO_FILE_MODE_BINARY)
      {
	if(corsaro->global_file != NULL)
	  {
	    /* global stats */
	    bytes_htonl(&gbuf[0], STATE(corsaro)->number_mismatched_packets);
	    bytes_htonl(&gbuf[4], attack_arr_cnt);
	    bytes_htonl(&gbuf[8],
			kh_size(STATE(corsaro)->attack_hash)-attack_arr_cnt);
	    if(corsaro_file_write(corsaro, corsaro->global_file,
				  &gbuf[0], 12) != 12)
	      {
		corsaro_log(__func__, corsaro,
			    "could not dump global stats to file");
		return -1;
	      }
	  }

	/* dump the number of vectors */
	bytes_htonl(&cntbuf[0], attack_arr_cnt);
	if(corsaro_file_write(corsaro, STATE(corsaro)->outfile,
			    &cntbuf[0], 4) != 4)
	  {
	    corsaro_log(__func__, corsaro,
			"could not dump vector count to file");
	    return -1;
	  }
	/* dump the vectors */
	for(i = 0; i < attack_arr_cnt; i++)
	  {
	    if(binary_dump(corsaro, attack_arr[i]) != 0)
	      {
		corsaro_log(__func__, corsaro, "could not dump hash");
		return -1;
	      }
	    attack_vector_reset(attack_arr[i]);
	  }
      }
  else
    {
      corsaro_log(__func__, corsaro, "invalid mode");
      return -1;
    }
  if(corsaro->global_file != NULL)
    {
      corsaro_io_write_plugin_end(corsaro, corsaro->global_file,
				  PLUGIN(corsaro));
    }
  corsaro_io_write_interval_end(corsaro, STATE(corsaro)->outfile, int_end);

  STATE(corsaro)->number_mismatched_packets = 0;

  free(attack_arr);

  /* if we are rotating, now is when we should do it */
  if(corsaro_is_rotate_interval(corsaro))
    {
      /* close the current file */
      if(STATE(corsaro)->outfile != NULL)
	{
	  corsaro_file_close(corsaro, STATE(corsaro)->outfile);
	  STATE(corsaro)->outfile = NULL;
	}
    }

  return 0;
}
示例#25
0
void
show_countdown_dialog (PurplePlugin * plugin) {
    GtkWidget *content_area;
    GtkWidget *img;
    GtkWidget *hbox, *vbox;
    GtkWidget *progress_bar;
    GtkWidget *gtkconv_window;
    GtkWidget *blist_window;
    GtkWidget *label = NULL;

    g_assert (plugin != NULL && plugin->extra != NULL);

    g_assert (PLUGIN (countdown_dialog) == NULL);

    progress_bar = gtk_progress_bar_new ();
    img =
        gtk_image_new_from_stock (PIDGIN_STOCK_INFO,
                                  gtk_icon_size_from_name
                                  (PIDGIN_ICON_SIZE_TANGO_SMALL));

    hbox = gtk_hbox_new (FALSE, PIDGIN_HIG_BOX_SPACE);
    vbox = gtk_vbox_new (FALSE, PIDGIN_HIG_BOX_SPACE);

    gtkconv_window = get_receiver_window (plugin);
    blist_window = pidgin_blist_get_default_gtk_blist ()->window;

    PLUGIN (countdown_dialog) =
        gtk_dialog_new_with_buttons (PLUGIN_NAME,
                                     GTK_WINDOW ((gtkconv_window) ?
                                                 gtkconv_window :
                                                 blist_window),
                                     0, GTK_STOCK_EXECUTE,
                                     GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,
                                     GTK_RESPONSE_REJECT, NULL);

    gtk_window_set_resizable (GTK_WINDOW (PLUGIN (countdown_dialog)), FALSE);
    gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (progress_bar), 0.05);

    g_object_set_data (G_OBJECT (PLUGIN (countdown_dialog)), "progress-bar",
                       progress_bar);

    label = gtk_label_new (COUNTDOWN_MSG);

    gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress_bar), 0);

#if GTK_CHECK_VERSION (2,14,0)
    content_area =
        gtk_dialog_get_content_area (GTK_DIALOG (PLUGIN (countdown_dialog)));
#else
    content_area = (GTK_DIALOG (PLUGIN (countdown_dialog)))->vbox;
#endif

    gtk_window_set_deletable (GTK_WINDOW (PLUGIN (countdown_dialog)), FALSE);
    gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
    gtk_box_pack_start_defaults (GTK_BOX (vbox), hbox);

    gtk_box_pack_start (GTK_BOX (hbox), img, FALSE, FALSE, 0);
    gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
    gtk_box_pack_start (GTK_BOX (vbox), progress_bar, FALSE, FALSE, 0);

    gtk_widget_show_all (PLUGIN (countdown_dialog));

    purple_timeout_add (250, (GSourceFunc) update_countdown, plugin);

    g_signal_connect_swapped (G_OBJECT (PLUGIN (countdown_dialog)),
                              "response",
                              G_CALLBACK (on_countdown_dialog_response_cb),
                              plugin);
}
示例#26
0
static gboolean
catch_hotkeys_cb (PidginWindow * win, GdkEventKey * event) {
    if (event->is_modifier == FALSE) {
        gint all_modifiers = 0;
        PurpleConversation *conv = NULL;

        if (event->state & GDK_SHIFT_MASK)
            all_modifiers |= GDK_SHIFT_MASK;
        if (event->state & GDK_CONTROL_MASK)
            all_modifiers |= GDK_CONTROL_MASK;
        if (event->state & GDK_MOD1_MASK)
            all_modifiers |= GDK_MOD1_MASK;

        conv = pidgin_conv_window_get_active_conversation (win);

        if (gdk_keyval_to_lower (event->keyval) ==
            (guint) purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FILE)
            &&
            all_modifiers ==
            purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FILE_MDFS))
        {

            PurpleConnection *gc = NULL;
            PurplePluginProtocolInfo *prpl_info = NULL;

            gc = purple_conversation_get_gc (conv);

            if ((gc != NULL) &&
                ((purple_conversation_get_type (conv) !=
                  PURPLE_CONV_TYPE_CHAT)
                 || !purple_conv_chat_has_left (PURPLE_CONV_CHAT (conv)))) {

                prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO (gc->prpl);
                if (purple_conversation_get_type (conv) ==
                    PURPLE_CONV_TYPE_IM
                    && prpl_info->send_file != NULL
                    && (!prpl_info->can_receive_file
                        || prpl_info->can_receive_file (gc,
                                                        purple_conversation_get_name
                                                        (conv)))) {
                    PurplePlugin *plugin =
                        purple_plugins_find_with_id (PLUGIN_ID);

                    if (PLUGIN (locked))
                        return FALSE;   /* Just return, don't fail. */
                    else {
                        PLUGIN (locked) = TRUE;
                        PLUGIN (send_as) = SEND_AS_FILE;
                        REMEMBER_ACCOUNT (PIDGIN_CONVERSATION (conv));
                        freeze_desktop (plugin, FALSE);
                    }
                }
            }
        }
#ifdef ENABLE_UPLOAD
        else if (gdk_keyval_to_lower (event->keyval) ==
                 (guint) purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FTP)
                 &&
                 all_modifiers ==
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FTP_MDFS)
            )
	  send_as_ftp_link(win, NULL);
	  //on_screenshot_insert_as_ftp_link_fromwin_activate_cb (win);
        else if (gdk_keyval_to_lower (event->keyval) ==
                 (guint) purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_HTTP)
                 &&
                 all_modifiers ==
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_HTTP_MDFS)
            )
	  send_as_link(win, NULL);
	  //on_screenshot_insert_as_link_fromwin_activate_cb (win);
#endif
        else if (gdk_keyval_to_lower (event->keyval) == (guint)
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_IMAGE)
                 &&
                 all_modifiers ==
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_IMAGE_MDFS)
		 ) {
          //  if (!(purple_conversation_get_features (conv) &
	  //      PURPLE_CONNECTION_NO_IMAGES))
	  //  on_screenshot_insert_as_image_fromwin_activate_cb (win);
        }
        else {
            /* nothing match ! */
        }
        return TRUE;
    }
    return FALSE;               /* let the signal be handled by other callbacks */
}
示例#27
0
/**
   If the plugin is locked, don't activate the menuitem.
   This tipically happens when we're sending the capture to a remote server.
 */
static void
on_insert_menu_show_cb (GtkWidget * screenshot_insert_menuitem) {
    PurplePlugin *plugin = purple_plugins_find_with_id (PLUGIN_ID);
    gtk_widget_set_sensitive (screenshot_insert_menuitem, !PLUGIN (locked));
}
示例#28
0
/** Parse the arguments given to the plugin */
static int parse_args(bgpcorsaro_t *bgpcorsaro)
{
  bgpcorsaro_plugin_t *plugin = PLUGIN(bgpcorsaro);
  struct bgpcorsaro_pfxmonitor_state_t *state = STATE(bgpcorsaro);
  int opt;
  bgpstream_pfx_storage_t pfx_st;

  if (plugin->argc <= 0) {
    return 0;
  }

  /* NB: remember to reset optind to 1 before using getopt! */
  optind = 1;

  while ((opt = getopt(plugin->argc, plugin->argv, ":l:L:m:n:i:M?")) >= 0) {
    switch (opt) {
    case 'm':
      if (optarg != NULL && strlen(optarg) - 1 <= PFXMONITOR_METRIC_PFX_LEN) {
        strncpy(state->metric_prefix, optarg, PFXMONITOR_METRIC_PFX_LEN);
      } else {
        fprintf(stderr, "Error: could not set metric prefix\n");
        usage(plugin);
        return -1;
      }
      break;

    case 'i':
      if (optarg != NULL && strlen(optarg) - 1 <= PFXMONITOR_METRIC_PFX_LEN) {
        strncpy(state->ip_space_name, optarg, PFXMONITOR_METRIC_PFX_LEN);
      } else {
        fprintf(stderr, "Error: could not set IP space name\n");
        usage(plugin);
        return -1;
      }
      break;

    case 'l':
      if (bgpstream_str2pfx(optarg, &pfx_st) == NULL) {
        fprintf(stderr, "Error: Could not parse prefix (%s)\n", optarg);
        usage(plugin);
        return -1;
      }
      bgpstream_ip_counter_add(state->poi, (bgpstream_pfx_t *)&pfx_st);
      break;

    case 'L':
      if (add_prefixes_from_file(state->poi, optarg) != 0) {
        return -1;
      }
      break;

    case 'M':
      state->more_specific = 1;
      break;

    case 'n':
      state->peer_asns_th = atoi(optarg);
      break;

    case '?':
    case ':':
    default:
      usage(plugin);
      return -1;
    }
  }

  /* if no prefixes were provided,  */
  if (bgpstream_ip_counter_get_ipcount(state->poi,
                                       BGPSTREAM_ADDR_VERSION_IPV4) == 0 &&
      bgpstream_ip_counter_get_ipcount(state->poi,
                                       BGPSTREAM_ADDR_VERSION_IPV6) == 0) {
    fprintf(stderr, "Error: no valid prefixes provided\n");
    usage(plugin);
    return -1;
  }

  return 0;
}
/* inspired from http://curl.haxx.se/libcurl/c/ftpupload.html */
static gpointer
ftp_upload (PurplePlugin * plugin) {
    CURL *curl;
    CURLcode res;
    GIOChannel *io_chan = NULL;

    struct stat file_info;
    gchar *remote_url = NULL;
    gchar *basename = NULL;

    g_assert (plugin != NULL && plugin->extra != NULL);

    G_LOCK (unload);
    /* get the file size of the local file */
    if (g_stat (PLUGIN (capture_path_filename), &file_info) == -1) {
        g_assert (PLUGIN (error) == NULL);
        g_set_error (&PLUGIN (error),
                     SENDSCREENSHOT_PLUGIN_ERROR,
                     PLUGIN_ERROR_OPEN_SCREENSHOT_FILE,
                     "%s\n%s",
                     PLUGIN_ERROR_OPEN_SCREENSHOT_FILE_s, g_strerror (errno));
        THREAD_QUIT;
    }
    PLUGIN (total_size) = file_info.st_size;

    basename = g_path_get_basename (PLUGIN (capture_path_filename));
    remote_url =
        g_strdup_printf ("%s/%s",
                         purple_prefs_get_string (PREF_FTP_REMOTE_URL),
                         basename);

    g_free (basename);
    basename = NULL;

    io_chan =
        g_io_channel_new_file (PLUGIN (capture_path_filename), "r",
                               &PLUGIN (error));
    if (io_chan == NULL) {
        g_assert (PLUGIN (error) != NULL);
        g_free (remote_url);
        THREAD_QUIT;
    }
    /* binary data, this should never fail */
    g_io_channel_set_encoding (io_chan, NULL, NULL);

    /* get a curl handle */
    curl = curl_easy_init ();
    if (curl != NULL) {
        static char curl_error[CURL_ERROR_SIZE];

        plugin_curl_set_common_opts (curl, plugin);

        /* we want to use our own read function */
        curl_easy_setopt (curl, CURLOPT_READFUNCTION, read_callback);
        curl_easy_setopt (curl, CURLOPT_READDATA, io_chan);

        /* enable uploading */
        curl_easy_setopt (curl, CURLOPT_UPLOAD, 1L);

        /* specify target */
        curl_easy_setopt (curl, CURLOPT_URL, remote_url);

        /* specify username and password */
        curl_easy_setopt (curl, CURLOPT_USERNAME,
                          purple_prefs_get_string (PREF_FTP_USERNAME));

        curl_easy_setopt (curl, CURLOPT_PASSWORD,
                          purple_prefs_get_string (PREF_FTP_PASSWORD));

        curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, curl_error);

        /* Now run off and do what you've been told! */
        res = curl_easy_perform (curl);

        PLUGIN (read_size) = 0;

        /* always cleanup */
        curl_easy_cleanup (curl);
        g_free (remote_url);

        if (PLUGIN (error) != NULL) {   /* read_callback() failed */
            g_io_channel_unref (io_chan);
            THREAD_QUIT;
        }
        else if (res != 0) {
            g_assert (PLUGIN (error) == NULL);
            g_set_error (&PLUGIN (error),
                         SENDSCREENSHOT_PLUGIN_ERROR,
                         PLUGIN_ERROR_FTP_UPLOAD,
                         "%s\n%s", PLUGIN_ERROR_FTP_UPLOAD_s, curl_error);
        }
    }
    if ((g_io_channel_shutdown (io_chan, TRUE, NULL)) == G_IO_STATUS_ERROR) {
        g_io_channel_unref (io_chan);
        THREAD_QUIT;
    }
    g_io_channel_unref (io_chan);
    THREAD_QUIT;
}
static gboolean
insert_ftp_link_cb (PurplePlugin * plugin) {
    g_assert (plugin != NULL && plugin->extra != NULL);

    /* still uploading... */
    if (PLUGIN (libcurl_thread) != NULL) {
        GtkProgressBar *progress_bar =
            g_object_get_data (G_OBJECT (PLUGIN (uploading_dialog)),
                               "progress-bar");

        g_assert (progress_bar != NULL);

        if (PLUGIN (read_size) == 0)
            gtk_progress_bar_pulse (progress_bar);
        else {

            gchar *str = NULL;
            gdouble val = PLUGIN (read_size) / (gdouble) PLUGIN (total_size);

            str = g_strdup_printf ("%d%%", (gint) (val * 100));
            gtk_progress_bar_set_text (progress_bar, str);
            g_free (str);
            gtk_progress_bar_set_fraction (progress_bar, val);

        }
        return TRUE;
    }
    else {
        PLUGIN (timeout_cb_handle) = 0;
        gtk_widget_destroy (PLUGIN (uploading_dialog));
        PLUGIN (uploading_dialog) = NULL;

        /* an error occured */
        if (PLUGIN (error) != NULL) {
            NotifyUploadError ("%s", PLUGIN (error)->message);
            g_error_free (PLUGIN (error));
            PLUGIN (error) = NULL;
        }
        else {
            gchar *remote_url;
            gchar *basename;

            basename = g_path_get_basename (PLUGIN (capture_path_filename));

            if (strcmp (purple_prefs_get_string (PREF_FTP_WEB_ADDR), ""))
                /* not only a ftp server, but also a html server */
                remote_url = g_strdup_printf ("%s/%s",
                                              purple_prefs_get_string
                                              (PREF_FTP_WEB_ADDR), basename);
            else
                remote_url = g_strdup_printf ("%s/%s",
                                              purple_prefs_get_string
                                              (PREF_FTP_REMOTE_URL),
                                              basename);

            real_insert_link (plugin, remote_url);
            g_free (remote_url);
            g_free (basename);
        }
    }
    plugin_stop (plugin);
    return FALSE;
}