Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package yast2-firstboot for openSUSE:Factory checked in at 2021-07-13 22:36:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/yast2-firstboot (Old) and /work/SRC/openSUSE:Factory/.yast2-firstboot.new.2625 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "yast2-firstboot" Tue Jul 13 22:36:50 2021 rev:106 rq:905297 version:4.4.3 Changes: -------- --- /work/SRC/openSUSE:Factory/yast2-firstboot/yast2-firstboot.changes 2021-07-02 13:26:48.101070357 +0200 +++ /work/SRC/openSUSE:Factory/.yast2-firstboot.new.2625/yast2-firstboot.changes 2021-07-13 22:36:53.862388251 +0200 @@ -1,0 +2,8 @@ +Fri Jul 9 11:59:31 UTC 2021 - Jos?? Iv??n L??pez Gonz??lez <jlo...@suse.com> + +- Remember plain passwords in order to provide a clean navigation + through the firstboot dialogs when going back and forward. +- Skip client for root password when needed (bsc#1188068). +- 4.4.3 + +------------------------------------------------------------------- Old: ---- yast2-firstboot-4.4.2.tar.bz2 New: ---- yast2-firstboot-4.4.3.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ yast2-firstboot.spec ++++++ --- /var/tmp/diff_new_pack.IJ5Cj6/_old 2021-07-13 22:36:54.318384579 +0200 +++ /var/tmp/diff_new_pack.IJ5Cj6/_new 2021-07-13 22:36:54.318384579 +0200 @@ -17,7 +17,7 @@ Name: yast2-firstboot -Version: 4.4.2 +Version: 4.4.3 Release: 0 Summary: YaST2 - Initial System Configuration License: GPL-2.0-only ++++++ yast2-firstboot-4.4.2.tar.bz2 -> yast2-firstboot-4.4.3.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/.rubocop.yml new/yast2-firstboot-4.4.3/.rubocop.yml --- old/yast2-firstboot-4.4.2/.rubocop.yml 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/.rubocop.yml 2021-07-09 15:37:09.000000000 +0200 @@ -12,6 +12,8 @@ Metrics/BlockLength: Max: 90 + Exclude: + - 'test/**/*.rb' # Configuration parameters: CountComments. Metrics/MethodLength: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/package/yast2-firstboot.changes new/yast2-firstboot-4.4.3/package/yast2-firstboot.changes --- old/yast2-firstboot-4.4.2/package/yast2-firstboot.changes 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/package/yast2-firstboot.changes 2021-07-09 15:37:09.000000000 +0200 @@ -1,4 +1,12 @@ ------------------------------------------------------------------- +Fri Jul 9 11:59:31 UTC 2021 - Jos?? Iv??n L??pez Gonz??lez <jlo...@suse.com> + +- Remember plain passwords in order to provide a clean navigation + through the firstboot dialogs when going back and forward. +- Skip client for root password when needed (bsc#1188068). +- 4.4.3 + +------------------------------------------------------------------- Thu Jun 17 07:43:12 UTC 2021 - David Diaz <dgonza...@suse.com> - Adapt code to Y2Users (part of jsc#PM-2620). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/package/yast2-firstboot.spec new/yast2-firstboot-4.4.3/package/yast2-firstboot.spec --- old/yast2-firstboot-4.4.2/package/yast2-firstboot.spec 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/package/yast2-firstboot.spec 2021-07-09 15:37:09.000000000 +0200 @@ -17,7 +17,7 @@ Name: yast2-firstboot -Version: 4.4.2 +Version: 4.4.3 Release: 0 Summary: YaST2 - Initial System Configuration License: GPL-2.0-only diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/src/lib/y2firstboot/clients/root.rb new/yast2-firstboot-4.4.3/src/lib/y2firstboot/clients/root.rb --- old/yast2-firstboot-4.4.2/src/lib/y2firstboot/clients/root.rb 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/src/lib/y2firstboot/clients/root.rb 2021-07-09 15:37:09.000000000 +0200 @@ -1,8 +1,4 @@ -#!/usr/bin/env ruby -# -# encoding: utf-8 - -# Copyright (c) [2016] SUSE LLC +# Copyright (c) [2016-2021] SUSE LLC # # All Rights Reserved. # @@ -21,51 +17,92 @@ # To contact SUSE LLC about this file by physical or electronic mail, you may # find current contact information at www.suse.com. +require "yast" require "y2users/password" require "y2users/linux/writer" require "y2users/config_manager" -require "y2users/clients/inst_root_first" +require "users/dialogs/inst_root_first" +require "y2firstboot/clients/user" + +Yast.import "GetInstArgs" module Y2Firstboot module Clients # Client for setting the root password - class Root < Y2Users::Clients::InstRootFirst - # Overload Y2Users::Clients::InstRootFirst#run to wipe the encrypted password - # @see #reset_password + class Root < Yast::Client def run - reset_password + return :auto unless run? + + load_password + + result = Yast::InstRootFirstDialog.new(root_user).run - super + if result == :next + write_config + save_password + end + + result end private - # Wipes encrypted password + # Whether to run the client + # + # Note that this client should be automatically skipped when root was configured to use the + # same password as a user. # - # @note This method can be considered a sort of workaround for supporting - # as much as possible a "clean" navigation through the Firstboot dialogs - # when going back and forward (just in case the admin decides to offer - # such a feature), EVEN THOUGH is not the intended behavior since - # Firstboot clients perform changes in the running system right away. - def reset_password - return unless root_user.password&.value&.encrypted? + # @return [Boolean] + def run? + force? || !root_password_from_user? + end - root_user.password = Y2Users::Password.create_plain("") + # Whether the client is configured to always run it + # + # @return [Boolean] + def force? + Yast::GetInstArgs.argmap.fetch("force", false) end - # Updates the target configuration and writes it to the system + # Whether the user password was used for root + # + # @see Y2Firstboot::Clients::User # - # @see Y2Users::Clients::InstRootFirst#update_target_config - def update_target_config - super + # @return [Boolean] + def root_password_from_user? + Y2Firstboot::Clients::User.user_password == Y2Firstboot::Clients::User.root_password + end + # Writes the config to the system + def write_config writer = Y2Users::Linux::Writer.new( - Y2Users::ConfigManager.instance.target, + config, Y2Users::ConfigManager.instance.system ) writer.write end + # Loads the saved plain password of the root user + # + # This is needed for supporting a "clean" navigation through the Firstboot dialogs when going + # back and forward. See also {#save_password}. + def load_password + value = Y2Firstboot::Clients::User.root_password || "" + root_user.password = Y2Users::Password.create_plain(value) + end + + # Saves the given root password + def save_password + Y2Firstboot::Clients::User.root_password = root_user.password_content + end + + # The root user + # + # @return [Y2Users::User] + def root_user + @root_user ||= config.users.root + end + # System config, which contains all the current users on the system # # @return [Y2Users::Config] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/src/lib/y2firstboot/clients/user.rb new/yast2-firstboot-4.4.3/src/lib/y2firstboot/clients/user.rb --- old/yast2-firstboot-4.4.2/src/lib/y2firstboot/clients/user.rb 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/src/lib/y2firstboot/clients/user.rb 2021-07-09 15:37:09.000000000 +0200 @@ -1,8 +1,4 @@ -#!/usr/bin/env ruby -# -# encoding: utf-8 - -# Copyright (c) [2016] SUSE LLC +# Copyright (c) [2016-2021] SUSE LLC # # All Rights Reserved. # @@ -21,53 +17,60 @@ # To contact SUSE LLC about this file by physical or electronic mail, you may # find current contact information at www.suse.com. +require "yast" require "y2users/password" require "y2users/linux/writer" require "y2users/config_manager" require "users/dialogs/inst_user_first" -Yast.import "Users" -Yast.import "Progress" - module Y2Firstboot module Clients - # Client to set up the first user during the firstboot mode + # Client to set up the user during the firstboot mode class User < Yast::Client class << self - # @return [String, nil] the username of the created/edited user as a - # result of the execution of this client, if any. Needed for retrieving - # the user when going back and forward. See {#user} + # The username of the created/edited user, if any. + # + # Needed for retrieving the user when going back and forward. + # + # @see #user + # + # @return [String, nil] attr_accessor :username + + # Plain password of the user, if any. + # + # Needed for retrieving the plain version of the password when going back and forward. Note + # that the user is committed to the system right away in this step, so when going back the + # password of the user would be already encrypted. The plain version of the password is + # needed in order to fill the password field with the current value, and also to determine + # whether that same password was used for root, see Yast::InstUserFirstDialog. + # + # @return [String, nil] + attr_accessor :user_password + + # Plain password of the root user, if any. + # + # @see #user_password + # + # @return [String, nil] + attr_accessor :root_password end def run - reset_password + load_values result = Yast::InstUserFirstDialog.new(config, user: user).run - write_config if result == :next - - # Updates the username reference. See {#user} - self.class.username = user.attached? ? user.name : nil + if result == :next + write_config + save_values + end result end private - # Wipes encrypted password - # - # @note This method can be considered a sort of workaround for supporting - # as much as possible a "clean" navigation through the Firstboot dialogs - # when going back and forward (just in case the admin decides to offer - # such a feature), EVEN THOUGH is not the intended behavior since - # Firstboot clients perform changes in the running system right away. - def reset_password - return unless user.password&.value&.encrypted? - - user.password = Y2Users::Password.create_plain("") - end - # Writes config to the system def write_config writer = Y2Users::Linux::Writer.new( @@ -78,11 +81,51 @@ writer.write end - # A copy of config holding all the users on the system + # Loads previously saved values # - # @return [Y2Users::Config] - def config - @config ||= Y2Users::ConfigManager.instance.system(force_read: true).copy + # This is needed for supporting a "clean" navigation through the Firstboot dialogs when going + # back and forward. See also {#save_values}. + def load_values + load_user_password + load_root_password + end + + # Loads the saved plain password of the user + def load_user_password + user.password = Y2Users::Password.create_plain(self.class.user_password || "") + end + + # Loads the saved plain password of the root user + def load_root_password + return unless self.class.root_password + + root_user.password = Y2Users::Password.create_plain(self.class.root_password) + end + + # Saves the given values + # + # @see #load_values + def save_values + save_username + save_user_password + save_root_password + end + + # Saves the given username + def save_username + self.class.username = user.attached? ? user.name : nil + end + + # Saves the given user password, if needed + def save_user_password + self.class.user_password = user.attached? ? user.password_content : nil + end + + # Saves the given root password, if needed + def save_root_password + return if root_user.password&.value&.encrypted? + + self.class.root_password = root_user&.password_content end # The user to be created/edited @@ -92,6 +135,20 @@ @user ||= config.users.by_name(self.class.username) if self.class.username @user ||= Y2Users::User.new("") end + + # The root user + # + # @return [Y2Users::User] + def root_user + @root_user ||= config.users.root + end + + # A copy of config holding all the users on the system + # + # @return [Y2Users::Config] + def config + @config ||= Y2Users::ConfigManager.instance.system(force_read: true).copy + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/test/y2firstboot/clients/root_test.rb new/yast2-firstboot-4.4.3/test/y2firstboot/clients/root_test.rb --- old/yast2-firstboot-4.4.2/test/y2firstboot/clients/root_test.rb 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/test/y2firstboot/clients/root_test.rb 2021-07-09 15:37:09.000000000 +0200 @@ -1,5 +1,6 @@ #!/usr/bin/env rspec -# Copyright (c) [2018] SUSE LLC + +# Copyright (c) [2018-2021] SUSE LLC # # All Rights Reserved. # @@ -24,87 +25,151 @@ describe Y2Firstboot::Clients::Root do subject(:client) { described_class.new } - let(:inst_root_dialog) { instance_double(Yast::InstRootFirstDialog, run: result) } - let(:result) { :next } + describe "#run" do + before do + allow(Yast::InstRootFirstDialog).to receive(:new).and_return(dialog) - let(:writer) { instance_double(Y2Users::Linux::Writer, write: []) } + allow_any_instance_of(Y2Users::Linux::Writer).to receive(:write) - let(:target_config) { Y2Users::Config.new } - let(:system_config) { Y2Users::Config.new } - let(:system_config_copy) { Y2Users::Config.new } - let(:config_manager) { Y2Users::ConfigManager.instance } - let(:root_user) { Y2Users::User.create_root } - let(:root_password) { nil } - - before do - root_user.password = root_password - allow(Yast::InstRootFirstDialog).to receive(:new).and_return(inst_root_dialog) - - allow(Y2Users::Linux::Writer).to receive(:new).and_return(writer) - - system_config_copy.attach([root_user]) - allow(system_config).to receive(:copy).and_return(system_config_copy) - allow(config_manager).to receive(:target).and_return(target_config) - allow(config_manager).to receive(:system).and_return(system_config) - end + allow(Y2Users::ConfigManager.instance).to receive(:system).and_return(system_config) - describe "#run" do - context "when root user has an encrypted password" do - let(:root_password) { Y2Users::Password.create_encrypted("s3cr3t") } + allow(system_config).to receive(:copy).and_return(config) + end - it "resets the root password" do - expect(root_user.password.value).to be_encrypted + let(:system_config) { Y2Users::Config.new.attach(root, user) } - subject.run + let(:config) { system_config.copy } - expect(root_user.password.value).to_not be_encrypted - expect(root_user.password_content).to be_empty + let(:root) do + Y2Users::User.create_root.tap do |root| + root.password = Y2Users::Password.create_encrypted("$xaadfd545dft") end end - context "when root user has a plain password" do - let(:root_password) { Y2Users::Password.create_plain("s3cr3t") } + let(:user) do + Y2Users::User.new("test").tap do |user| + user.password = Y2Users::Password.create_encrypted("$xa9545dft") + end + end - it "does not reset the root password" do - expect(root_user.password_content).to eq("s3cr3t") + let(:dialog) { instance_double(Yast::InstRootFirstDialog, run: dialog_result) } + + let(:dialog_result) { :back } + + context "if the client was forced to be executed" do + before do + allow(Yast::GetInstArgs).to receive(:argmap).and_return("force" => true) + end + + it "opens the dialog for configuring root" do + expect(dialog).to receive(:run) subject.run + end + + it "sets the plain password to the root user" do + Y2Firstboot::Clients::User.root_password = "S3cr3T" + + expect(Yast::InstRootFirstDialog).to receive(:new) do |_root| + expect(config.users.root.password_content).to eq("S3cr3T") + end.and_return(dialog) + + subject.run + end + end - expect(root_user.password_content).to eq("s3cr3t") + context "if the client was not forced to be executed" do + before do + allow(Yast::GetInstArgs).to receive(:argmap).and_return("force" => false) + end + + context "and the user password was used for root" do + before do + Y2Firstboot::Clients::User.user_password = "S3cr3T" + Y2Firstboot::Clients::User.root_password = "S3cr3T" + end + + it "does not open the dialog for configuring root" do + expect(dialog).to_not receive(:run) + + subject.run + end + + it "returns :auto" do + expect(subject.run).to eq(:auto) + end + end + + context "and the user password was not used for root" do + before do + Y2Firstboot::Clients::User.user_password = "S3cr3T" + Y2Firstboot::Clients::User.root_password = "root-S3cr3T" + end + + it "opens the dialog for configuring root" do + expect(dialog).to receive(:run) + + subject.run + end + + it "sets the plain password to the root user" do + expect(Yast::InstRootFirstDialog).to receive(:new) do |_root| + expect(config.users.root.password_content).to eq("root-S3cr3T") + end.and_return(dialog) + + subject.run + end end end - context "when inst_root_dialog result is :next" do - let(:result) { :next } + context "when the dialog result is :next" do + let(:dialog_result) { :next } + + before do + Y2Firstboot::Clients::User.user_password = "S3cr3T" + Y2Firstboot::Clients::User.root_password = "root-S3cr3T" + end - it "updates users target configuration" do - expect(config_manager).to receive(:target=).with(system_config_copy) + it "writes the config to the system" do + expect(Y2Users::Linux::Writer).to receive(:new) + .with(config, system_config).and_call_original subject.run end - it "writes the target users configuration" do - expect(Y2Users::Linux::Writer).to receive(:new).with(target_config, system_config) - expect(writer).to receive(:write) + it "updates the plain root password for the next run" do + expect(Yast::InstRootFirstDialog).to receive(:new) do |root| + root.password = Y2Users::Password.create_plain("root-more-S3cr3T") + end.and_return(dialog) subject.run + + expect(Y2Firstboot::Clients::User.root_password).to eq("root-more-S3cr3T") end end - context "when inst_root_dialog result is not :next" do - let(:result) { :back } + context "when dialog result is not :next" do + let(:dialog_result) { :back } - it "does not update users target configuration" do - expect(config_manager).to_not receive(:target=) + before do + Y2Firstboot::Clients::User.user_password = "S3cr3T" + Y2Firstboot::Clients::User.root_password = "root-S3cr3T" + end + + it "does not write the users configuration" do + expect(Y2Users::Linux::Writer).to_not receive(:new) subject.run end - it "does not write users configuration" do - expect(Y2Users::Linux::Writer).to_not receive(:new) - expect(writer).to_not receive(:write) + it "does not update the plain root password for the next run" do + expect(Yast::InstRootFirstDialog).to receive(:new) do |root| + root.password = Y2Users::Password.create_plain("root-more-S3cr3T") + end.and_return(dialog) subject.run + + expect(Y2Firstboot::Clients::User.root_password).to eq("root-S3cr3T") end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/yast2-firstboot-4.4.2/test/y2firstboot/clients/user_test.rb new/yast2-firstboot-4.4.3/test/y2firstboot/clients/user_test.rb --- old/yast2-firstboot-4.4.2/test/y2firstboot/clients/user_test.rb 2021-06-30 15:47:16.000000000 +0200 +++ new/yast2-firstboot-4.4.3/test/y2firstboot/clients/user_test.rb 2021-07-09 15:37:09.000000000 +0200 @@ -1,5 +1,6 @@ #!/usr/bin/env rspec -# Copyright (c) [2018] SUSE LLC + +# Copyright (c) [2018-2021] SUSE LLC # # All Rights Reserved. # @@ -25,108 +26,149 @@ subject(:client) { described_class.new } describe "#run" do - let(:dialog) { instance_double(Yast::InstUserFirstDialog, run: result) } - let(:result) { :next } + before do + allow(Yast::InstUserFirstDialog).to receive(:new).and_return(dialog) - let(:user) { Y2Users::User.new(username) } - let(:username) { "chamaleon" } - let(:password) { nil } - let(:attached) { false } - - let(:system_config) { Y2Users::Config.new } - let(:system_config_copy) { Y2Users::Config.new } - let(:config_manager) { Y2Users::ConfigManager.instance } + allow_any_instance_of(Y2Users::Linux::Writer).to receive(:write) - let(:writer) { instance_double(Y2Users::Linux::Writer, write: []) } + allow(Y2Users::ConfigManager.instance).to receive(:system).and_return(system_config) - before do - user.password = password - system_config_copy.attach([user]) + allow(system_config).to receive(:copy).and_return(config) + end - allow(Yast::InstUserFirstDialog).to receive(:new).and_return(dialog) + let(:system_config) { Y2Users::Config.new.attach(root) } - allow(Y2Users::Linux::Writer).to receive(:new).and_return(writer) + let(:config) { system_config.copy.attach(user) } - allow(subject).to receive(:user).and_return(user) - allow(user).to receive(:attached?).and_return(attached) + let(:root) do + Y2Users::User.create_root.tap do |root| + root.password = Y2Users::Password.create_encrypted("$xaadfd545dft") + end + end - allow(system_config).to receive(:copy).and_return(system_config_copy) - allow(config_manager).to receive(:system).and_return(system_config) + let(:user) do + Y2Users::User.new("test").tap do |user| + user.password = Y2Users::Password.create_encrypted("$xa9545dft") + end end - context "when user has an encrypted password" do - let(:password) { Y2Users::Password.create_encrypted("s3cr3t") } + let(:dialog) { instance_double(Yast::InstUserFirstDialog, run: dialog_result) } + + let(:dialog_result) { :back } - it "resets the user password" do - expect(user.password.value).to be_encrypted + context "if the client is executed for first time" do + before do + described_class.username = nil + end + + it "opens the dialog with a new user" do + expect(Yast::InstUserFirstDialog).to receive(:new) do |_config, params| + expect(params[:user].attached?).to eq(false) + end.and_return(dialog) subject.run + end - expect(user.password.value).to_not be_encrypted - expect(user.password_content).to be_empty + it "returns the dialog result" do + expect(subject.run).to eq(dialog_result) end end - context "when user has a plain password" do - let(:password) { Y2Users::Password.create_plain("s3cr3t") } + context "if the client was already executed" do + before do + described_class.username = "test" + described_class.user_password = "S3cr3T" + described_class.root_password = "root-S3cr3T" + end - it "does not reset the user password" do - expect(user.password_content).to eq("s3cr3t") + it "opens the dialog with the previously created user" do + expect(Yast::InstUserFirstDialog).to receive(:new) do |_config, params| + expect(params[:user].attached?).to eq(true) + expect(params[:user].name).to eq("test") + end.and_return(dialog) subject.run + end - expect(user.password_content).to eq("s3cr3t") + it "sets the saved plain password to the user" do + expect(Yast::InstUserFirstDialog).to receive(:new) do |_config, params| + expect(params[:user].password_content).to eq("S3cr3T") + end.and_return(dialog) + + subject.run end - end - it "executes the inst_user_first dialog" do - expect(Yast::InstUserFirstDialog).to receive(:new).with(system_config_copy, user: user) - expect(dialog).to receive(:run) + it "sets the plain password to the root user" do + expect(Yast::InstUserFirstDialog).to receive(:new) do |config, _params| + expect(config.users.root.password_content).to eq("root-S3cr3T") + end.and_return(dialog) - subject.run - end + subject.run + end - it "returns the dialog result" do - expect(subject.run).to eq(result) + it "returns the dialog result" do + expect(subject.run).to eq(dialog_result) + end end - context "when dialog result is :next" do - it "writes the users configuration" do - expect(Y2Users::Linux::Writer).to receive(:new).with(system_config_copy, system_config) - expect(writer).to receive(:write) + context "when the dialog result is :next" do + let(:dialog_result) { :next } - subject.run + before do + described_class.username = "test" end - end - context "when dialog result is not :next" do - let(:result) { :back } + it "writes the config to the system" do + expect(Y2Users::Linux::Writer).to receive(:new) + .with(config, system_config).and_call_original - it "does not write the users configuration" do - expect(Y2Users::Linux::Writer).to_not receive(:new) - expect(writer).to_not receive(:write) + subject.run + end + + it "updates the saved user values for the next run" do + expect(Yast::InstUserFirstDialog).to receive(:new) do |config, params| + user = params[:user] + user.name = "test2" + user.password = Y2Users::Password.create_plain("more-S3cr3T") + config.users.root.password = Y2Users::Password.create_plain("root-more-S3cr3T") + end.and_return(dialog) subject.run + + expect(described_class.username).to eq("test2") + expect(described_class.user_password).to eq("more-S3cr3T") + expect(described_class.root_password).to eq("root-more-S3cr3T") end end - context "if user is attached" do - let(:attached) { true } + context "when dialog result is not :next" do + let(:dialog_result) { :back } - it "saves the username for future reference" do - expect(described_class).to receive(:username=).with(username) + before do + described_class.username = "test" + described_class.user_password = "S3cr3T" + described_class.root_password = "root-S3cr3T" + end + + it "does not write the users configuration" do + expect(Y2Users::Linux::Writer).to_not receive(:new) subject.run end - end - context "if user is not attached" do - let(:attached) { false } - - it "deletes username reference" do - expect(described_class).to receive(:username=).with(nil) + it "does not update the saved user values for the next run" do + expect(Yast::InstUserFirstDialog).to receive(:new) do |config, params| + user = params[:user] + user.name = "test2" + user.password = Y2Users::Password.create_plain("more-S3cr3T") + config.users.root.password = Y2Users::Password.create_plain("more-root-S3cr3T") + end.and_return(dialog) subject.run + + expect(described_class.username).to eq("test") + expect(described_class.user_password).to eq("S3cr3T") + expect(described_class.root_password).to eq("root-S3cr3T") end end end