Advertisement
Guest User

Untitled

a guest
Jun 13th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.05 KB | None | 0 0
  1. static void parse_attrs_xml(GMarkupParseContext *context,
  2.         const gchar *element_name, const gchar **attribute_names,
  3.         const gchar **attribute_values, gpointer user_data, GError **error) {
  4.     PurpleProxyInfo **proxy_info_ptr = user_data;
  5.     for (; *attribute_names && *attribute_values; attribute_names++, attribute_values++) {
  6.             /****************************** PROXY *********************************/
  7.         if (strcasecmp(*attribute_names, "proxy_type") == 0 && *proxy_info_ptr) {
  8.             unsigned int type = strtoul(*attribute_values, NULL, 10);
  9.             if (type == UINT_MAX) {
  10.                 yobot_log_warn("proxy_type returned UINT_MAX");
  11.                 *proxy_info_ptr = NULL;
  12.             } else if (PURPLE_PROXY_USE_GLOBAL > type && type < PURPLE_PROXY_USE_ENVVAR) {
  13.                 (*proxy_info_ptr)->type = type;
  14.             } else {
  15.                 yobot_log_warn("unknown proxy type %d", type);
  16.                 *proxy_info_ptr = NULL;
  17.             }
  18.         } else if (strcasecmp(*attribute_names, "proxy_host") == 0 && *proxy_info_ptr) {
  19.             if (**attribute_values) {
  20.                 (*proxy_info_ptr)->host = g_strdup(*attribute_values);
  21.             } else {
  22.                 yobot_log_warn("server is NULL");
  23.                 *proxy_info_ptr = NULL;
  24.             }
  25.         } else if (strcasecmp(*attribute_names, "proxy_port") == 0 && *proxy_info_ptr) {
  26.             unsigned int port = strtoul(*attribute_values, NULL, 10);
  27.             if (port == UINT_MAX) {
  28.                 yobot_log_warn("proxy_port specified, but got NULL");
  29.                 *proxy_info_ptr = NULL;
  30.             } else {
  31.                 (*proxy_info_ptr)->port = (int) port;
  32.             }
  33.         } else if (strcasecmp(*attribute_names, "proxy_username") == 0 && *proxy_info_ptr) {
  34.             if (**attribute_values) {
  35.                 (*proxy_info_ptr)->username = g_strdup(*attribute_values);
  36.             } else {
  37.                 yobot_log_warn("username attr specified but no username provided");
  38.                 *proxy_info_ptr = NULL;
  39.             }
  40.         } else if (strcasecmp(*attribute_names, "proxy_password") == 0 && *proxy_info_ptr) {
  41.             if (**attribute_values) {
  42.                 (*proxy_info_ptr)->password = g_strdup(*attribute_values);
  43.             } else {
  44.                 yobot_log_warn("password attr specified but no password provided");
  45.                 *proxy_info_ptr = NULL;
  46.             }
  47.         } else {
  48.             yobot_log_warn("unknown attribute \"%s\"", *attribute_names);
  49.         }
  50.     }
  51. }
  52. static void mkacct(const yobotmkacct_internal *arq) {
  53.     yobot_log_info("new user: %s, proto %s",
  54.             arq->user, yobot_proto_get_prpl_id(arq->yomkacct->improto));
  55.  
  56.     yobot_log_debug("calling purple_acount_new");
  57.     PurpleAccount *acct = purple_account_new(arq->user,
  58.             yobot_proto_get_prpl_id(arq->yomkacct->improto));
  59.     yobot_purple_account_refcount_register(acct);
  60.     yobot_purple_account_refcount_increase(acct);
  61.     yobot_purple_account_context_set(acct);
  62.     purple_account_set_password(acct, arq->pass);
  63.     if(arq->attr_xml) {
  64.         PurpleProxyInfo *proxy_info = g_new0(PurpleProxyInfo, 1);
  65.         PurpleProxyInfo *pinfo_ptr = proxy_info;
  66.         GMarkupParser parser;
  67.         memset(&parser, 0, sizeof(GMarkupParser));
  68.         parser.start_element = parse_attrs_xml;
  69.         GMarkupParseContext *context = g_markup_parse_context_new(
  70.                 &parser, 0, &pinfo_ptr, NULL);
  71.         GError *parse_error;
  72.         g_markup_parse_context_parse(context, arq->attr_xml,
  73.                 arq->yomkacct->paramlen, &parse_error);
  74.         g_markup_parse_context_end_parse(context, &parse_error);
  75.         while(pinfo_ptr) {
  76.             if(proxy_info->port && !proxy_info->host) {
  77.                 yobot_log_warn("port specified for proxy but no host");
  78.                 pinfo_ptr = NULL;
  79.                 break;
  80.             }
  81.             if(proxy_info->password && !proxy_info->username) {
  82.                 yobot_log_warn("password specified but no user");
  83.                 free(proxy_info->password);
  84.                 proxy_info->password = NULL;
  85.             }
  86.             break;
  87.         }
  88.         if (pinfo_ptr) {
  89.             yobot_log_info("using proxy %s:%d", proxy_info->host, proxy_info->port);
  90.             purple_account_set_proxy_info(acct, proxy_info);
  91.         } else {
  92.             free(proxy_info->host);
  93.             free(proxy_info->password);
  94.             free(proxy_info->username);
  95.             free(proxy_info);
  96.         }
  97.     } else {
  98.         yobot_log_debug("attr_xml null?: %p", arq->attr_xml);
  99.     }
  100.     yobot_log_debug("done.. now setting up account ui data");
  101.     account_uidata *tmp = malloc(sizeof(account_uidata));
  102.     tmp->id = arq->yomkacct->id;
  103.     acct->ui_data = tmp;
  104.     purple_accounts_add(acct);
  105.     yobot_log_debug("added account");
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement