#!/usr/bin/perl ################################################################################ # Mandriva Online # # # # Copyright (C) 2010 Mandriva # # # # Thierry Vignaud # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License Version 2 as # # published by the Free Software Foundation. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ################################################################################ use strict; use lib qw(/usr/lib/libDrakX /usr/lib/libDrakX/drakfirsttime); use standalone; # for explanations use common; use run_program; BEGIN { unshift @::textdomains, 'mdkonline' } use mygtk2 qw(gtknew); #- do not import gtkadd which conflicts with ugtk2 version use ugtk2 qw(:all); use urpm::cfg; use mdkonline; use mdkapplet_gui; use interactive; use XML::Simple; use URI::Escape; use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Request; use interactive::gtk; foreach my $opt (@ARGV) { if ($opt =~ /--(rpm-root|urpmi-root)=(.*)/) { $::rpmdrake_options{$1}[0] = $2; undef $opt; } } my ($version) = @ARGV; my $email; $version or die "usage: $0 \n"; # make it work on 2008.X: eval { interactive::gtk::add_padding(Gtk2::Label->new) }; if ($@) { *interactive::gtk::add_padding = sub { $_[0] }; } read_sys_config(); get_extmaint_authentication(); ugtk2::exit(0); sub get_extended_maintenance_data() { require Rpmdrake::open_db; get_product_id(); my @distros = get_distro_list(); return if !@distros; my $current_apimdv_distro = find_current_distro(@distros); @$current_apimdv_distro{qw(extended-maintenance extended-maintenance-end desktop-update-end basic-update-end)}; } sub get_extmaint_authentication() { my $w = ugtk2->new(N("Adding an additional package medium"), width => $width + 20); my ($password_w, $email_w, $password); $password_w = gtknew('Entry'); $password_w->set_visibility(0); my ($url, $extended_maintenance_end, $desktop_update_end, $basic_update_end) = eval { get_extended_maintenance_data() }; if (my $err = $@) { interactive->vnew->ask_warn(N("Error"), N("Failure while retrieving distributions list:") . "\n$err"); return; } $w->{ok_clicked} = sub { $password = $password_w->get_text; Gtk2->main_quit; }; my @widgets = ( if_(!$::isEmbedded, get_banner(N("Extended Maintenance")), ), gtknew('Label_Left', text_markup => join("\n\n", #-PO: Here '%s' will be a localized date (eg: "2009/11/28" in english but "28/11/2009" for brazil or "28 Nov. "2009" for french: N("Mandriva provides 12 months of desktop updates (until %s) and 18 months of base updates (up to the %s) for distributions.", iso8601_date_to_locale($desktop_update_end), iso8601_date_to_locale($basic_update_end)), N("Extended maintenance is now available to get 18 months of additional updates (until %s).", iso8601_date_to_locale($extended_maintenance_end)), N("You can subscribe right now to get extended maintenance:"), ), @common), new_link_button($url, N("Online subscription")), gtknew('HSeparator'), gtknew('Label_Left', text => N("Please fill in your account ID to add an additional package medium once you have subscribed online"), @common), gtknew('HButtonBox', layout => 'start', children_tight => [ interactive::gtk::add_padding( new_link_button('https://my.mandriva.com/info', N("More information on your user account"))) ]), gtknew('Table', col_spacings => 5, row_spacings => 5, children => [ [ N("Your email"), $email_w = gtknew('Entry', text => $email) ], [ N("Your password"), $password_w ], ]), gtknew('HButtonBox', layout => 'start', children_tight => [ interactive::gtk::add_padding( new_link_button('https://my.mandriva.com/reset/password/', N("Forgotten password"))) ]), create_okcancel($w, N("Next"), N("Cancel")), ); fill_n_run_portable_dialog($w, \@widgets); $email = $email_w->get_text; # means OK handler got run: if ($password) { if ($email && $password) { add_extmaint_medium($email, $password); } else { interactive->vnew->ask_warn(N("Error"), N("Password and email cannot be empty.")); goto &get_extmaint_authentication; } } else { ugtk2::exit(0); } } my $error; sub add_extmaint_medium { my ($email, $password) = @_; my $res = get_from("https://my.mandriva.com/rest/authenticate", [ 'username', $email, 'password', $password, 'return', 'userdata' ]); my $ref = xml2perl($res); if ($ref->{code} != 0) { my $in = interactive->vnew; $in->ask_warn(N("Error"), N("An error occurred") . "\n" . $ref->{message}); goto &get_extmaint_authentication; } elsif (!ref($ref->{data}{groups}{'ext-maint-' . $version})) { no_rights_dialog(); } else { $error = 0; my $arch = urpm::cfg::get_arch(); actually_add_extmaint_medium($ref, $password, $arch) or adding_media_failed(); # FIXME: is not enough if we ever support sparc64, ppc64 and the like: if ($arch eq 'x86_64') { actually_add_extmaint_medium($ref, $password, 'i586') or adding_media_failed(); } if (!$error) { $config{EXTENDED_SUPPORT} = bool2yesno(1); setVarsInSh($config_file, \%config); #interactive->vnew->ask_okcancel(N("Error"), N("An error occurred while adding medium")); my $w = ugtk2->new(N("Successfully added media %s.", 'Extended Maintenance'), grab => 1); $w->_ask_okcancel(N("Successfully added media %s.", 'Extended Maintenance'), N("Ok"), undef); ugtk2::main($w); } } } sub no_rights_dialog() { my $w = ugtk2->new(N("Adding an additional package medium"), width => $width + 20); fill_n_run_portable_dialog( $w, [ if_(!$::isEmbedded, get_banner(N("Extended Maintenance"))), gtknew('Label_Left', text => N("Your Mandriva account does not have Extended Maintenance subscription enabled."), @common), gtknew('HButtonBox', layout => 'start', children_tight => [ interactive::gtk::add_padding( new_link_button('https://my.mandriva.com/', N("More Information"))) ]), create_okcancel($w, N("Close"), undef), ]); } sub adding_media_failed { $error = 1; interactive->vnew->ask_warn(N("Error"), N("An error occurred while adding medium")); goto &get_extmaint_authentication; } sub actually_add_extmaint_medium { my ($ref, $password, $arch) = @_; $password = uri_escape($password); my @options = (get_urpmi_options(), '--update'); my $email = uri_escape($ref->{data}{email}); my $uri = "https://$email:$password\@dl.mandriva.com/extended/$version/$arch"; run_program::raw(@options, "Extended Maintenance $arch " . int(rand(100000)), ${uri}); }